AnonymousComparer - ver.1.1.0.0
- 2010-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の他のところでも結構出てくるので覚えておくと便利です。富豪的?気にしない気にしない。