AnonymousComparer - ver.1.1.0.0
- C# - 10.01/26
AnonymousComparerをバージョンアップしました。ダウンロードは上記リンク先、CodePlexからどうぞ。更新内容はCreateのオーバーロードに追加して、IEqualityComparerの完全模写を可能にしました。今まではキー選択だけだったのですが、今回からはEqualsとGetHashCodeを個別に指定することが可能です。
var myClassComparer = AnonymousComparer.Create<MyClass>( (x, y) => x.MyProperty == y.MyProperty, // Equals obj => obj.MyProperty.GetHashCode()); // GetHashCode
こんな感じに指定します。全くもってそのままです。Equalsとかをラムダ式で指定するというだけです。型推論は効きませんので指定してやってください。なお、使い方自体は全然変わってませんので、普通の使い方は初回リリース時の記事を参照ください。
以下オマケ。
// ランダムでtrueかfalse返すComparer var rand = new Random(); var randomComparer = AnonymousComparer.Create<MyClass>( (_, __) => rand.Next(0, 2) == 0, _ => 0); // 間引くのに使えるぜ! var mabiita = list.Distinct(randomComparer).ToArray(); // とか思ったけど、最初の一つ目は必ず選択されるのよね(Distinctなので当然……) // といった、特殊な間引き方をしたい人はどうぞ(いません) // 普通にやるならWhereでランダムにフィルタリングするのを選びます
色々と用途が考えられるようで、そもそもEqualityComparer自体があまり使う状況ってないので、使い道が考えられない微妙な感じが素敵です。まあ、AnonymousComparer自体はふつーに使う分にはふつーに便利ですので、Linqのお供にどうぞ。もう一つ、今度は役に立つ例でも。
class MyClass { public int Prop1 { get; set; } public string Prop2 { get; set; } public string Prop3 { get; set; } } static void Main() { var array = new[] { new MyClass{Prop1=30, Prop2="hoge", Prop3="huga"}, new MyClass{Prop1=100, Prop2="foo", Prop3="bar"}, new MyClass{Prop1=100, Prop2="hoge", Prop3="mos"}, new MyClass{Prop1=30, Prop2="hoge", Prop3="mos"} }; // Prop1とProp2が一致するのだけ省きたい!といった複数キー指定は匿名型を作る array.Distinct(mc => new { mc.Prop1, mc.Prop2 }); }
複数キーで比較したい時は、匿名型を作るのが手っ取り早いです。こういった用途に匿名型を使うというテクニックは、Linqの他のところでも結構出てくるので覚えておくと便利です。富豪的?気にしない気にしない。
