📚
IComparableを自動実装するComparableGeneratorを公開しました
IComparableの実装って案外細かいところに気を配って実装すると面倒ですよね?
そこでC#9.0のリリースと同時にサポートされたSource Generatorをつかって、属性宣言するだけで簡単にIComparableを実装できるライブラリを作成しました。
機会があれば、ぜひご利用ください。
ちなみにこのライブラリ以上に、ソースの方にSource Generator関連のノウハウが詰まりまくってて価値があるんじゃないかという噂も・・・
Introduction
さて、簡単な使い方をご紹介します。
ここではEmployeeクラスの姓と名でソートするようなIComparableを実装する例をご紹介します。
パッケージのインストール
まずはNuGetからパッケージをインストールします。
- NuGet : ComparableGenerator
Install-Package ComparableGenerator
LangVersionを9.0+に
ComparableGeneratorで生成されるコードは、C#9.0のサポートを必要とします。
.csprojを開いて、LangVersionを以下のように9.0(もしくはそれ以上、latestなど)に変更してください。
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<LangVersion>9.0</LangVersion>
</PropertyGroup>
IComparable実装クラスの作成
ここでは、つぎのようなEmployeeクラスを作成します。
using ComparableGenerator;
namespace SampleConsoleApp
{
[Comparable]
public partial class Employee
{
[CompareBy(Priority = 2)]
public string FirstName { get; set; }
[CompareBy(Priority = 1)]
public string LastName { get; set; }
}
}
IComparableを実装したいクラスにComparable属性を宣言し、ソートに利用するメンバーへCompareBy属性を宣言します。
この時、ソートの優先順位を指定するため、PriorityはType内で一意になる値を指定してください。
なお未指定の場合のデフォルト値は0なので、ソート対象のメンバーが1つの場合は、Priorityは省略も可能です。
利用する
では利用してみましょう。
var employees = new List<Employee>();
employees.Add(new Employee {LastName = "Tanaka", FirstName = "Taro"});
employees.Add(new Employee {LastName = "Suzuki", FirstName = "Jiroh"});
employees.Add(new Employee {LastName = "Suzuki", FirstName = "Ichiroh"});
employees.Sort();
employees.ForEach(x => Console.WriteLine($"{x.LastName} {x.FirstName}"));
このコードを実行すると、つぎのような結果が得られるはずです。
Suzuki Ichiroh
Suzuki Jiroh
Tanaka Taro
ちゃんと姓、名の順でソートされていることがわかりますね!
ということで、機会があればぜひご利用ください!
Discussion