2013年4月2日火曜日

C#で大文字小文字が入り混じってるListを大文字小文字無視してDistinctしたい

C#で大文字小文字が入り混じってる List mylist がありまして、コレをそのまま素直にmylist.Distinct() して、その結果でWindowsのファイルシステム上でファイル名として扱うと大文字小文字違いで同じファイルを作ってしまうことがあって困ってた。

例えばリストに

 Hello
 world
 hello
 world
 bye
と入ってたとしてこれを素直にDistinctしてやると
 Hello
 world
 hello
 bye
となって"Hello"と"hello"が残ってしまう。
感覚としてはlamda式を使って
mylist.Distinct((l,r) => l.ToLower() == r.ToLower());
としてやりたい感じだけど、この表記は受け付けてくれない。
Distinct関数はIEqualityComparerなるクラスを継承した比較オブジェクトを作ってやらないといけないらしい。なんて面倒なっ!

とネットを徘徊してたらカコイイコードを見つけたっ!

mylist.GroupBy(v1 => v1.ToLower()).Select(v2 => v2.First());

やべーかっこ良すぎる><
ネタ元は↓
c# - Distinct() with lambda? - Stack Overflow

速度面とかは置いといてこれなら気軽にメンバーの一部をID的に扱ってUniq化したオブジェクトのリストとかも簡単に作れそうだね

0 件のコメント: