我可以使用LINQ检查列表中的对象是否具有唯一ID吗?

Jac*_*Orr 6 c# linq list object

说我有一个包含这样的对象的列表:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我想检查每个人都有一个唯一的ID.我想返回一个布尔值true/false,具体取决于ID是否唯一.这是我用LINQ可以实现的吗?

The*_*der 6

我会使用Distinct然后检查计数例如:

bool bAreAllPeopleUnique = (personList.Distinct(p => p.ID).Count == personList.Count);
Run Code Online (Sandbox Code Playgroud)

但是,正如@Ian所评论的那样,您需要在类中添加一个属性,Person以便您可以像这样访问Id:

public string ID
{
    get { return _id; }
}
Run Code Online (Sandbox Code Playgroud)

实现这一目标的"更好"方法是添加如下方法:

private bool AreAllPeopleUnique(IEnumerable<Person> people)
{
    return (personList.Distinct(p => p.ID).Count == personList.Count);
}
Run Code Online (Sandbox Code Playgroud)

注意:该方法IEnumerable不是列表,因此实现该接口的任何类都可以使用该方法.


xan*_*tos 6

请注意,您甚至可以直接利用HashSet<>

var hs = new HashSet<string>();
bool areAllPeopleUnique = personList.All(x => hs.Add(x.Id));
Run Code Online (Sandbox Code Playgroud)

(并且是我通常使用的代码)

它的优点是在最好的情况下(存在一些重复项),它会在分析所有personList集合之前停止。