![](/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.