読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

Enumerable.ToLookup メソッドなんてのがあるんですね

C#

ToLookup メソッドの存在を知らなかったので MSDN で調べてみました。

ほうほう。
IEnumerable なコレクションをグループ分け出来るメソッド、ってことですね。
新しい事を知ったらまずは使ってみる、と云う事で早速テストコードを書いてみました。
# 普段は変数などには multi byte な文字列は使わない主義なんですが、今回のサンプルはどうにも日本語表記にした方がしっくりくる(ってか アルファベットだと書きにくかった)ので日本語にしました。

using System;
using System.Collections.Generic;
using System.Linq;

namespace Jp.Mkns.Wankuma.Test {
  public enum Colors {
    紅,
    黄,
    白
  }
  public class Person {
    public Colors Color { get; set; }
    public string Name  { get; set; }
  }

  public class ToLookupTest {
    static void Main() {
      var list = new List<Person>();
      list.Add(new Person() { Color = Colors.紅, Name = "福沢祐巳"   });
      list.Add(new Person() { Color = Colors.黄, Name = "島津由乃"   });
      list.Add(new Person() { Color = Colors.白, Name = "藤堂志摩子" });
      list.Add(new Person() { Color = Colors.紅, Name = "小笠原祥子" });
      list.Add(new Person() { Color = Colors.黄, Name = "支倉玲"     });
      list.Add(new Person() { Color = Colors.紅, Name = "水野蓉子"   });
      list.Add(new Person() { Color = Colors.黄, Name = "鳥居江利子" });
      list.Add(new Person() { Color = Colors.白, Name = "佐藤聖"     });
      list.Add(new Person() { Color = Colors.紅, Name = "松平瞳子"   });
      list.Add(new Person() { Color = Colors.白, Name = "二条乃梨子" });
      list.Add(new Person() { Color = Colors.黄, Name = "有馬菜々"   });
      Console.WriteLine("----- 振り分け前 -----");
      for (int i = 0; i < list.Count; i++) {
        Console.WriteLine("[{0,2}] Color = {1}, Name = {2}", i, list[i].Color, list[i].Name);
      }
      // Color で振り分け
      var lookup = list.ToLookup(item => item.Color);
      Console.WriteLine("----- 振り分け後 -----");
      foreach (var group in lookup) {
        Console.WriteLine("キー : {0}", group.Key);
        var item = group.ToList();
        for (int i = 0; i < item.Count; i++) {
          Console.WriteLine("  [{0}] Color = {1}, Name = {2}", i, item[i].Color, item[i].Name);
        }
      }
    }
  }
}

実行結果。

----- 振り分け前 -----
[ 0] Color = 紅, Name = 福沢祐巳
[ 1] Color = 黄, Name = 島津由乃
[ 2] Color = 白, Name = 藤堂志摩子
[ 3] Color = 紅, Name = 小笠原祥子
[ 4] Color = 黄, Name = 支倉玲
[ 5] Color = 紅, Name = 水野蓉子
[ 6] Color = 黄, Name = 鳥居江利子
[ 7] Color = 白, Name = 佐藤聖
[ 8] Color = 紅, Name = 松平瞳子
[ 9] Color = 黄, Name = 二条乃梨子
[10] Color = 白, Name = 有馬菜々
----- 振り分け後 -----
キー : 紅
  [0] Color = 紅, Name = 福沢祐巳
  [1] Color = 紅, Name = 小笠原祥子
  [2] Color = 紅, Name = 水野蓉子
  [3] Color = 紅, Name = 松平瞳子
キー : 黄
  [0] Color = 黄, Name = 島津由乃
  [1] Color = 黄, Name = 支倉玲
  [2] Color = 黄, Name = 鳥居江利子
  [3] Color = 黄, Name = 有馬菜々
キー : 白
  [0] Color = 白, Name = 藤堂志摩子
  [1] Color = 白, Name = 佐藤聖
  [2] Color = 白, Name = 二条乃梨子

振り分けのキーは任意の型が指定出来る様ですね。これは結構使えるかも。
# (追記)壮大にデータをミスっていたので修正 ^^;;;