IComparableを自動実装するComparableGeneratorを公開しました

2 min読了の目安(約1800字TECH技術記事

IComparableの実装って案外細かいところに気を配って実装すると面倒ですよね?

そこでC#9.0のリリースと同時にサポートされたSource Generatorをつかって、属性宣言するだけで簡単にIComparableを実装できるライブラリを作成しました。

機会があれば、ぜひご利用ください。

ちなみにこのライブラリ以上に、ソースの方にSource Generator関連のノウハウが詰まりまくってて価値があるんじゃないかという噂も・・・

Introduction

さて、簡単な使い方をご紹介します。

ここではEmployeeクラスの姓と名でソートするようなIComparableを実装する例をご紹介します。

パッケージのインストール

まずはNuGetからパッケージをインストールします。

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

ちゃんと姓、名の順でソートされていることがわかりますね!

ということで、機会があればぜひご利用ください!