我希望从人员列表中获取不同列表。
List<Person> plst = cl.PersonList;
如何通过LINQ
执行此操作。我想将结果存储在List<Person>
答案 0 :(得分:5)
Distinct()
会为您提供不同的值 - 但除非您覆盖Equals
/ GetHashCode()
,否则您将获得不同的引用。例如,如果您希望两个Person
对象的名称相等,则需要覆盖Equals
/ GetHashCode
来表示。 (理想情况下,实施IEquatable<Person>
以及仅覆盖Equals(object)
。)
然后,您需要致电ToList()
以List<Person>
取回结果:
var distinct = plst.Distinct().ToList();
如果你想通过某些特定属性来获得不同的人,但这不是“自然”平等的合适候选人,那么你需要像这样使用GroupBy
:
var people = plst.GroupBy(p => p.Name)
.Select(g => g.First())
.ToList();
或使用MoreLINQ中的DistinctBy
方法:
var people = plst.DistinctBy(p => p.Name).ToList();
答案 1 :(得分:1)
您可以使用Distinct方法,您需要实现IEquatable并覆盖equals和hashcode。
public class Person : IEquatable<Person>
{
public string Name { get; set; }
public int Code { get; set; }
public bool Equals(Person other)
{
//Check whether the compared object is null.
if (Object.ReferenceEquals(other, null)) return false;
//Check whether the compared object references the same data.
if (Object.ReferenceEquals(this, other)) return true;
//Check whether the person' properties are equal.
return Code.Equals(other.Code) && Name.Equals(other.Name);
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public override int GetHashCode()
{
//Get hash code for the Name field if it is not null.
int hashPersonName = Name == null ? 0 : Name.GetHashCode();
//Get hash code for the Code field.
int hashPersonCode = Code.GetHashCode();
//Calculate the hash code for the person.
return hashPersonName ^ hashPersonCode;
}
}
var distinctPersons = plst.Distinct().ToList();
答案 2 :(得分:1)
使用Distinct扩展方法将返回一个IEnumerable,然后您可以执行ToList()
:
List<Person> plst = cl.PersonList.Distinct().ToList();