簡體   English   中英

我可以使用LINQ檢查列表中的對象是否具有唯一ID嗎?

[英]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集合之前停止。

最好的方法之一是重寫EqualsGetHashCode ,並實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM