Jadi saya punya koleksi benda. Jenis pastinya tidak penting. Dari sini saya ingin mengekstrak semua pasangan unik dari sepasang properti tertentu, dengan demikian:
myObjectCollection.Select(item=>new
{
Alpha = item.propOne,
Bravo = item.propTwo
}
).Distinct();
Jadi pertanyaan saya adalah: Apakah Perbedaan dalam hal ini menggunakan objek default sama dengan (yang akan berguna bagi saya, karena setiap objek baru) atau dapatkah dikatakan untuk melakukan yang sama dengan yang berbeda (dalam hal ini, nilai yang sama dari Alpha dan Bravo => instance yang sama)? Apakah ada cara untuk mencapai hasil itu, jika ini tidak berhasil?
Jawaban:
Bacalah tulisan bagus K. Scott Allen di sini:
Dan Kesetaraan untuk Semua ... Jenis Anonim
Jawaban singkatnya (dan saya kutip):
Jadi benar-benar aman untuk menggunakan metode Distinct () pada kueri yang mengembalikan tipe anonim.
sumber
Maaf untuk pemformatan yang kacau sebelumnya
sumber
object
danobject
. Jika keduaobject
adalahstring
masih mengembalikan duplikasi baris. CobaFirstName
ketik isofobject
dan tetapkan dengan yang sama distring
sana.Menarik bahwa ia bekerja di C # tetapi tidak di VB
Mengembalikan 26 huruf:
Pengembalian 52 ...
sumber
Key
kata kunci ke jenis anonim, itu.Distinct()
akan berfungsi sebagaimana dimaksud (misalnyaNew With { Key .lower = x.ToString.ToLower(), Key .upper = x.ToString.ToUpper()}
).new {A = b}
adalahNew {Key .A = b}
. Properti non-kunci dalam kelas VB anonim bisa berubah, itulah sebabnya mereka dibandingkan dengan referensi. Di C #, semua properti dari kelas anonim tidak dapat diubah.Saya menjalankan sedikit tes dan menemukan bahwa jika properti adalah tipe nilai, sepertinya berfungsi ok. Jika mereka bukan tipe nilai, maka kebutuhan tipe itu menyediakan implementasi Equals dan GetHashCode sendiri agar bisa berfungsi. Saya pikir, string akan berhasil.
sumber
Anda dapat membuat metode Extension Berbeda Anda sendiri yang mengambil ekspresi lambda. Ini sebuah contoh
Buat kelas yang berasal dari antarmuka IEqualityComparer
Kemudian buat metode Distinct Extension Anda
dan Anda dapat menggunakan metode ini untuk menemukan item yang berbeda
sumber
object
danobject
. Jika keduaobject
adalahstring
masih mengembalikan duplikasi baris. CobaFirstName
ketik isofobject
dan tetapkan dengan yang sama distring
sana.Jika
Alpha
danBravo
keduanya mewarisi dari kelas umum, Anda akan dapat menentukan pemeriksaan kesetaraan di kelas induk dengan menerapkanIEquatable<T>
.Sebagai contoh:
sumber
Hai, di sana saya mendapat masalah yang sama dan saya menemukan solusinya. Anda harus mengimplementasikan antarmuka IEquatable atau cukup mengganti Metode (Equals & GetHashCode). Tapi ini bukan triknya, trik yang datang dalam Metode GetHashCode. Anda tidak boleh mengembalikan kode hash dari objek kelas Anda tetapi Anda harus mengembalikan hash dari properti yang ingin Anda bandingkan seperti itu.
Seperti yang Anda lihat saya mendapat kelas yang disebut orang mendapat 3 properti (Nama, Umur, IsEgyptian "Karena saya") Dalam GetHashCode saya mengembalikan hash properti Name bukan objek Person.
Cobalah dan ini akan berfungsi ISA. Terima kasih, Modather Sadik
sumber
public override int GetHashCode() { return this.Name.GetHashCode() ^ this.Age.GetHashCode() ^ this.IsEgyptian.GetHashCode(); }
Agar dapat bekerja di VB.NET, Anda perlu menentukan
Key
kata kunci sebelum setiap properti dalam jenis anonim, seperti ini:Saya berjuang dengan ini, saya pikir VB.NET tidak mendukung fitur jenis ini, tetapi sebenarnya tidak.
sumber