![](/img/trans.png)
[英]How to use Linq to check a list of objects property have allowed values from another list
[英]Can I use LINQ to check if objects in a list have a unique ID?
說我有一個包含這樣的對象的列表:
public class Person
{
private string _name;
private string _id;
private int _age;
public Person
{
}
// Accessors
}
public class ManipulatePerson
{
Person person = new Person();
List<Person> personList = new List<Person>;
// Assign values
private void PopulateList();
{
// Loop
personList.Add(person);
// Check if every Person has a unique ID
}
}
我想檢查每個人都有一個唯一的ID。 我想返回一個布爾值true / false,具體取決於ID是否唯一。 這是我用LINQ可以實現的嗎?
我會使用Distinct然后檢查計數例如:
bool bAreAllPeopleUnique = (personList.Distinct(p => p.ID).Count == personList.Count);
但是,正如@Ian所述,您需要向Person
類添加一個屬性 ,以便您可以像這樣訪問Id:
public string ID
{
get { return _id; }
}
實現這一目標的“更好”方法是添加如下方法:
private bool AreAllPeopleUnique(IEnumerable<Person> people)
{
return (personList.Distinct(p => p.ID).Count == personList.Count);
}
注意:該方法接受IEnumerable
而不是列表,以便實現該接口的任何類都可以使用該方法。
請注意,您甚至可以直接利用HashSet<>
:
var hs = new HashSet<string>();
bool areAllPeopleUnique = personList.All(x => hs.Add(x.Id));
(這是我通常使用的代碼)
它的優點是,在最佳情況下(存在一些重復),它將在分析所有personList
集合之前停止。
最好的方法之一是重寫Equals
和GetHashCode
,並實現IEquatable<T>
:
public class Person : IEquatable<Person>
{
public string Id { get; set; }
public override bool Equals(object some) => Equals(some as Person);
public override bool GetHashCode() => Id != null ? Id.GetHashCode() : 0;
public bool Equals(Person person) => person != null && person.UniqueId == UniqueId;
}
現在您可以使用HashSet<T>
來存儲唯一對象,並且您無法存儲重復項。 此外,如果您嘗試添加重復項, Add
將返回false
。
注意:我的IEquatable<T>
和Equals
/ GetHashCode
覆蓋是非常基本的,但是此示例實現應該為您提供有關如何優雅地處理場景的良好提示。
您可以查看此問答以了解如何實現GetHashCode
對於重寫的System.Object.GetHashCode,什么是最佳算法?
也許這個其他問答可能會對你有意義: 為什么在重寫Equals方法時重寫GetHashCode很重要?
您可以使用GroupBy
獲取唯一項:
var result = personList.GroupBy(p=> p.Id)
.Select(grp => grp.First())
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.