อย่างน้อยก็ฉันก็เชื่อเช่นนั้น เหตุผลเบื้องหลังคือความเท่าเทียมกันของคอลเลกชันอาจเป็นพฤติกรรมที่ผู้ใช้กำหนด
องค์ประกอบในคอลเลกชันไม่ควรอยู่ในลำดับที่เฉพาะเจาะจงแม้ว่าพวกเขาจะมีการสั่งซื้อตามธรรมชาติมันไม่ใช่สิ่งที่อัลกอริทึมการเปรียบเทียบควรพึ่งพา สมมติว่าคุณมีสองคอลเล็กชัน:
{1, 2, 3, 4}
{4, 3, 2, 1}
พวกเขาเท่ากันหรือไม่? คุณต้องรู้ แต่ฉันไม่รู้ว่ามุมมองของคุณคืออะไร
คอลเลกชันจะไม่มีการเรียงลำดับแนวคิดโดยค่าเริ่มต้นจนกว่าอัลกอริทึมจะมีกฎการเรียงลำดับ สิ่งเดียวกันกับที่เซิร์ฟเวอร์ SQL จะให้ความสนใจคือเมื่อคุณพยายามทำการแบ่งหน้าคุณต้องจัดเตรียมกฎการเรียงลำดับ:
https://docs.microsoft.com/en-US/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
อีกสองคอลเล็กชัน:
{1, 2, 3, 4}
{1, 1, 1, 2, 2, 3, 4}
อีกครั้งพวกเขาเท่ากันหรือไม่? คุณบอกฉัน ..
องค์ประกอบการทำซ้ำของคอลเลกชันมีบทบาทในสถานการณ์ที่แตกต่างกันและบางคอลเลกชันเช่น Dictionary<TKey, TValue>
ไม่อนุญาตให้มีองค์ประกอบซ้ำ
ฉันเชื่อว่าความเท่าเทียมกันประเภทนี้มีการกำหนดแอปพลิเคชันและกรอบงานจึงไม่ได้ให้การใช้งานที่เป็นไปได้ทั้งหมด
ในกรณีทั่วไปEnumerable.SequenceEqual
ก็ดีพอ แต่มันกลับเท็จในกรณีต่อไปนี้:
var a = new Dictionary<String, int> { { "2", 2 }, { "1", 1 }, };
var b = new Dictionary<String, int> { { "1", 1 }, { "2", 2 }, };
Debug.Print("{0}", a.SequenceEqual(b)); // false
ฉันอ่านคำตอบสำหรับคำถามเช่นนี้ (คุณอาจgoogleสำหรับพวกเขา) และสิ่งที่ฉันจะใช้โดยทั่วไป:
public static class CollectionExtensions {
public static bool Represents<T>(this IEnumerable<T> first, IEnumerable<T> second) {
if(object.ReferenceEquals(first, second)) {
return true;
}
if(first is IOrderedEnumerable<T> && second is IOrderedEnumerable<T>) {
return Enumerable.SequenceEqual(first, second);
}
if(first is ICollection<T> && second is ICollection<T>) {
if(first.Count()!=second.Count()) {
return false;
}
}
first=first.OrderBy(x => x.GetHashCode());
second=second.OrderBy(x => x.GetHashCode());
return CollectionExtensions.Represents(first, second);
}
}
นั่นหมายถึงคอลเล็กชันหนึ่งแสดงถึงองค์ประกอบอื่นในองค์ประกอบรวมถึงเวลาที่ทำซ้ำโดยไม่คำนึงถึงการสั่งซื้อดั้งเดิม หมายเหตุเกี่ยวกับการนำไปใช้งาน:
GetHashCode()
เป็นเพียงการสั่งซื้อไม่ได้สำหรับความเท่าเทียมกัน; ฉันคิดว่ามันเพียงพอในกรณีนี้
Count()
จะไม่แจกแจงคอลเลกชันและตกอยู่ในการดำเนินการของ ICollection<T>.Count
ถ้าการอ้างอิงเท่ากันมันก็แค่ Boris
IList
? คำถามไม่ชัดเจน