我在一個串列中有兩個物件,并希望確保這些物件的所有屬性都具有相同的值。
例如:
List<Person> persons = new List<Person>
{
new Person { Id = "1", Name = "peter" },
new Person { Id = "1", Name = "peter" }
};
現在我想得到true兩個物件的屬性是相同的。我嘗試過使用以下 lambda 運算式。
var areEqual = persons.All(o => o == persons.First());
但我要false進去了areEqual。我無法理解為什么會這樣,并且想知道如何正確地做到這一點。
uj5u.com熱心網友回復:
您可以使用以下方法確定所有元素是否相同:
persons.Distinct().Count() == 1
如果它為零,則首先沒有條目,如果大于 1,則您的條目不一樣。
現在......你如何確保.Distinct()呼叫知道兩個物件何時相同?
選項 1:
Person已經是record. 偉大的。內置功能。完畢。選項 2:
Person實作IEquatable<Person>并執行您想要的檢查。選項 3:以您需要的方式
Person覆寫Object.Equals并自行覆寫。Object.GetHashCode選項 4:
Person以上都不是,您不想更改它以選中其中一個框。然后你仍然可以實作你自己的IEqualityComparer<Person>并將它的一個實體傳遞給 distinct 方法,如下所示:persons.Distinct(new MyCustomPersonEqualityComparer()).Count() == 1
uj5u.com熱心網友回復:
如果您的專案少于 2 個,則此查詢將毫無意義。因此,使用第一個元素All
var allAreSame = persons.All(p => p.Id == persons[0].Id && p.Name == persons[0].Name);
uj5u.com熱心網友回復:
Person是參考型別,默認 == 是執行記憶體的位置相等檢查。為了執行您自己的相等性檢查,您必須實施IComparable<Person>.
您也可以使用record代替class,這在幕后實作了對記錄的公共屬性的相等性檢查。
public record Person
{
public string Id { get; set; }
public string Name { get; set; }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/482860.html
下一篇:委托和等待任務
