より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

LinqのOrderByでIComparerを使いたい場合

C#LinqのOrderBy関数は、配列を並び替えた結果を返す関数です。

var arrange = people.OrderBy(p => p.No);

といったようにソートするキーを渡すのが主だった使い方です。

しかし、OrderBy関数にはIComparerを実装したクラスを渡すことができます。

クラスであるため、やや複雑なソートが行う際に使うことができます。

しかし、このOrderBy、MSDNを見ても使い方がパッと見ではわかりづらいです。

以下のように呼び出します。

var arrange = people.OrderBy(p => p, comparer);

docs.microsoft.com

Let's code

using System;
using System.Collections.Generic;
using System.Linq;
                    
public class Program
{
    public static void Main()
    {
        var people = new Person[] {
            new Person { No = 2 , Name = "Yamada"},
            new Person { No = 2 , Name = "Suzuki"},
            new Person { No = 1 , Name = "Tanaka"},
        };
        var comparer = new CustomComparer();
        var arrange = people.OrderBy(p => p, comparer);
        foreach(var person in arrange) {
            Console.WriteLine(person.No + " " + person.Name);
        }
    }
    
    public class Person {
        public int No  {get; set;}
        public string Name { get; set;}
    }
    
    public class CustomComparer : IComparer<Person> {
      public int Compare(Person x, Person y)
      {
          if (x.No != y.No) {
              return x.No.CompareTo(y.No);
          }
          return x.Name.CompareTo(y.Name);
      }
    }
}

f:id:rimever:20200718083549p:plain

参考記事

www.java2s.com