ใช่ฉันมีจำนวนมากและต้องการรับค่าที่แตกต่างจากมัน
ใช้มีแน่นอนวิธีขยายที่เรียกว่าSystem.Linq
Distinct
ในกรณีง่าย ๆ มันสามารถใช้โดยไม่มีพารามิเตอร์เช่น:
var distinctValues = myStringList.Distinct();
ดีและดี แต่ถ้าฉันมีจำนวนวัตถุที่ฉันต้องระบุความเท่าเทียมกันเกินพิกัดที่มีอยู่เท่านั้นคือ:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
อาร์กิวเมนต์เท่าเทียมกัน Comparer IEqualityComparer<T>
ต้องเป็นตัวอย่างของ แน่นอนว่าฉันสามารถทำสิ่งนี้ได้ แต่มันค่อนข้างละเอียดและดูดี
สิ่งที่ฉันคาดหวังก็คือโอเวอร์โหลดที่จะเอาแลมบ์ดาพูด Func <T, T, bool>:
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
มีใครทราบบ้างไหมว่าส่วนขยายดังกล่าวมีอยู่หรือไม่ หรือฉันกำลังพลาดอะไรอยู่?
หรือมีวิธีระบุ IEqualityComparer inline (ทำให้ลำบากใจฉัน) หรือไม่
ปรับปรุง
ฉันพบคำตอบของ Anders Hejlsberg ต่อการโพสต์ในฟอรัม MSDN ในหัวข้อนี้ เขาพูดว่า:
ปัญหาที่คุณจะพบคือเมื่อวัตถุสองตัวเปรียบเทียบกันเท่ากับพวกเขาจะต้องมีค่าส่งคืน GetHashCode เดียวกัน (หรือตารางแฮชที่ใช้ภายในโดย Distinct จะทำงานไม่ถูกต้อง) เราใช้ IEqualityComparer เพราะมันใช้งานร่วมกับ Equals และ GetHashCode ได้ในอินเตอร์เฟสเดียว
ฉันคิดว่าเหมาะสมแล้ว
.Distinct(new KeyEqualityComparer<Customer,string>(c1 => c1.CustomerId))
, และอธิบายว่าทำไม GetHashCode () เป็นสิ่งสำคัญในการทำงานอย่างถูกต้อง