我有以下示例類
public class Item
{
public string name { get; set; }
public double price { get; set; }
}
public class Basket
{
public Item[] items;
}
然后我做了兩個 的實體Basket,都包含Items
var basket1 = new Basket()
{
items = new Item[]
{
new Item() { name = "bread", price = 1.5 },
new Item() { name = "butter", price = 2 }
}
};
var basket2 = new Basket()
{
items = new Item[]
{
new Item() { name = "butter", price = 2 },
new Item() { name = "bread", price = 1.5 }
}
};
我想比較Basket1有Basket2,忽略了購物籃專案的順序。比較時,此示例應回傳True(它們相等)。我應該如何進行?
uj5u.com熱心網友回復:
@Neil 答案是正確的,只是它不適用于參考型別(字串是一個例外,因為它們是不可變的)。
Item 是一個類,所以它是一個參考型別。
Except使用默認的相等比較器來比較元素。由于 Item 是一個類,所以會通過參考進行比較,這不是我們想要的解決方案。所以我們需要繞過默認的比較,使用自定義的相等比較器。Except為此目的存在多載。
您將需要創建一個型別,該型別實作IEqualityComparer<Item>并將該型別的實體傳遞給Except.
請參閱:除了多載檔案和IEqualityComparer 檔案
這是您可以在 Linqpad 中運行的示例。它使用兩種Except多載。一個回傳false,另一個true:
void Main()
{
var basket1 = new Basket()
{
items = new Item[]
{
new Item() { name = "bread", price = 1.5 },
new Item() { name = "butter", price = 2 }
}
};
var basket2 = new Basket()
{
items = new Item[]
{
new Item() { name = "butter", price = 2 },
new Item() { name = "bread", price = 1.5 }
}
};
var isIdenticalByReference = (!(basket1.items.Except(basket2.items).Any())); // false
isIdenticalByReference.Dump();
var isIdenticalWithCustomEqualityComparer = (!(basket1.items.Except(basket2.items, new ItemEqualityComparer()).Any())); // true
isIdenticalWithCustomEqualityComparer.Dump();
}
// You can define other methods, fields, classes and namespaces here
public class Item
{
public string name { get; set; }
public double price { get; set; }
public int GetHashCode(object obj)
{
return (name?.GetHashCode() ?? 0) ^ price.GetHashCode();
}
}
public class ItemEqualityComparer : IEqualityComparer<Item>
{
public bool Equals(Item I1, Item I2)
{
if (I2 == null && I1 == null)
return true;
else if (I1 == null || I2 == null)
return false;
else return I1.name == I2.name && I1.price == I2.price;
}
public int GetHashCode(Item item)
{
return (item.name?.GetHashCode() ?? 0) ^ item.price.GetHashCode();
}
}
public class Basket
{
public Item[] items;
}
uj5u.com熱心網友回復:
您可以使用Except, 然后檢查回傳值中是否有任何內容:
// first list
var list1 = new List<string>();
list1.Add("A");
list1.Add("B");
list1.Add("C");
list1.Add("D");
// second list
var list2 = new List<string>();
list2.Add("C");
list2.Add("D");
var list3 = list1.Except(list2);
var listIsIdentical = !list3.Any();
uj5u.com熱心網友回復:
您需要覆寫從基類 Object 繼承的默認 Equals 和 GetHashCode 方法。然后,您可以使用 正確比較兩個籃子!basket1.items.Except(basket2.items).Any();。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/366749.html
