Benar, jadi saya punya enumerable dan ingin mendapatkan nilai yang berbeda dari itu.
Menggunakan System.Linq
, tentu saja ada metode ekstensi yang disebut Distinct
. Dalam kasus sederhana, ini dapat digunakan tanpa parameter, seperti:
var distinctValues = myStringList.Distinct();
Baik dan bagus, tetapi jika saya memiliki banyak objek yang harus saya tentukan persamaannya, satu-satunya kelebihan yang tersedia adalah:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
Argumen pembanding kesetaraan harus merupakan turunan dari IEqualityComparer<T>
. Saya bisa melakukan ini, tentu saja, tetapi agak bertele-tele dan, yah, tidak jelas.
Apa yang saya harapkan adalah kelebihan yang akan mengambil lambda, katakanlah Func <T, T, bool>:
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
Adakah yang tahu jika ada ekstensi seperti itu, atau beberapa solusi yang setara? Atau apakah saya melewatkan sesuatu?
Atau, apakah ada cara untuk menentukan inline IEqualityComparer (mempermalukan saya)?
Memperbarui
Saya menemukan balasan oleh Anders Hejlsberg ke sebuah posting di forum MSDN tentang hal ini. Dia berkata:
Masalah yang akan Anda hadapi adalah ketika dua objek membandingkan sama, mereka harus memiliki nilai balik GetHashCode yang sama (atau tabel hash yang digunakan secara internal oleh Distinct tidak akan berfungsi dengan benar). Kami menggunakan IEqualityComparer karena ini mengemas implementasi Equals dan GetHashCode yang kompatibel ke dalam satu antarmuka.
Saya kira itu masuk akal ..