C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で比較デリゲートを使って複合型のリストを並べ替える方法をわかりやすく解説

C#の List<T> クラスには複数の Sort() メソッドのオーバーロードが用意されており、そのうちの1つは引数として Comparison デリゲートを受け取ります。このデリゲートを活用することで、独自に定義したクラスのような複合型のリストでも、任意の基準で柔軟に並べ替えることができます。

public void Sort(Comparison<T> comparison)

CompareTo メソッドは、現在のインスタンスの値が、指定したオブジェクトまたは別の Int16 インスタンスの値よりも「小さい」「等しい」「大きい」のいずれであるかを示す整数を返します。戻り値が負の値なら「小さい」、0なら「等しい」、正の値なら「大きい」ことを意味します。

C#の Int16.CompareTo() メソッドは、このインスタンスを指定したオブジェクト、または別の Int16 インスタンスと比較するために使用されます。

サンプルコード

以下の例では、ID・Name・Salary プロパティを持つ Employee クラス(複合型)のリストを作成し、ラムダ式を使って ID 順にソートしています。

class Program{
   public static void Main(){
      Employee Employee1 = new Employee(){
         ID = 101,
         Name = "Mark",
         Salary = 4000
      };
      Employee Employee2 = new Employee(){
         ID = 103,
         Name = "John",
         Salary = 7000
      };
      Employee Employee3 = new Employee(){
         ID = 102,
         Name = "Ken",
         Salary = 5500
      };
      List<Employee> listEmployees = new List<Employee>();
      listEmployees.Add(Employee1);
      listEmployees.Add(Employee2);
      listEmployees.Add(Employee3);
      Console.WriteLine("ソート前の従業員");
      foreach (Employee Employee in listEmployees){
         Console.WriteLine(Employee.ID);
      }
      // ラムダ式でIDの昇順にソート
      listEmployees.Sort((x, y) => x.ID.CompareTo(y.ID));
      Console.WriteLine("IDでソート後の従業員");
      foreach (Employee Employee in listEmployees){
         Console.WriteLine(Employee.ID);
      }
      // リストを反転して降順に変更
      listEmployees.Reverse();
      Console.WriteLine("IDの降順に並べた従業員");
      foreach (Employee Employee in listEmployees){
         Console.WriteLine(Employee.ID);
      }
   }
   // 手法1:従業員を比較するロジックを含むメソッド
   private static int CompareEmployees(Employee c1, Employee c2){
      return c1.ID.CompareTo(c2.ID);
   }
}
public class Employee{
   public int ID { get; set; }
   public string Name { get; set; }
   public int Salary { get; set; }
}

実行結果

ソート前の従業員
101
103
102
IDでソート後の従業員
101
102
103
IDの降順に並べた従業員
103
102
101

コードのポイント

  • ラムダ式による比較: (x, y) => x.ID.CompareTo(y.ID) は、2つの Employee オブジェクトを受け取り、ID プロパティを CompareTo で比較する処理を1行で簡潔に記述しています。
  • 降順ソートの方法: 昇順にソートした後、Reverse() を呼び出すことで降順にできます。また、y.ID.CompareTo(x.ID) のように引数の順序を入れ替えても同じ結果が得られます。
  • 名前付きメソッドの利用: ラムダ式の代わりに、事前に定義した CompareEmployees メソッドを listEmployees.Sort(CompareEmployees); のように渡すことも可能です。比較ロジックが複雑になる場合はこちらの方が可読性が高まります。

なお、ソートの基準は ID 以外のプロパティでも問題ありません。例えば給与順に並べ替えたい場合は (x, y) => x.Salary.CompareTo(y.Salary) のように記述するだけで対応できます。

  1. JavaScriptで<select>リストの項目を事前選択(プリセレクト)する方法

    JavaScriptを使って<select>リストの項目を事前に選択状態にするには、selectedIndexプロパティを使用します。このプロパティに、あらかじめ選択しておきたい項目のインデックス番号を設定するだけで実現できます。<script>タグ内での記述方法は以下のとおりです。add_select_idには<select>タグに付けたidを、add_item_indexには数値のインデックスを指定します。なお、このインデックスは0から始まる点に注意してください。たとえば先頭の項目は「0」、2番目の項目は「1」となり、事前選択したい項目に対応する番号を設

  2. JavaScriptでHTMLリストを並べ替える方法を初心者向けに解説

    Webページ上のリスト(<ul>や<ol>)を、ボタンをクリックしたときに自動的にアルファベット順へ並べ替えたいケースはよくあります。JavaScriptを使えば、ページを再読み込みすることなく、DOMを直接操作してリスト項目の順序を入れ替えることができます。ここでは、「クリックすると並べ替えが実行されるボタン」を持つシンプルなサンプルを紹介します。サンプルコード<!DOCTYPE html> <html> <body> <h1>リスト並べ替えの例</h1> <button>クリックして並べ替え&l