我玩LINQ来了解它,但我不知道如何使用鲜明当我没有一个简单的列表(一个简单的整数列表是很容易做到的,这不是问题)。如果我想使用鲜明的列表<TElement>上的一个或多个属性的TElement?

示例:如果一个对象是Person,具有属性Id。我怎么能得到所有人,并使用鲜明对他们与对象的属性Id ?

Person1: Id=1, Name="Test1"
Person2: Id=1, Name="Test1"
Person3: Id=2, Name="Test2"

如何得到Person1和Person3?这可能吗?

如果用LINQ是不可能的,那么根据Person的某些属性获得Person列表的最佳方法是什么?


当前回答

也许这个能帮上忙,试试这个。使用HashSet可以提高代码性能。

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    var known = new HashSet<TKey>();
    return source.Where(element => known.Add(keySelector(element)));
}

其他回答

重写Equals(object obj)和GetHashCode()方法:

class Person
{
    public int Id { get; set; }
    public int Name { get; set; }

    public override bool Equals(object obj)
    {
        return ((Person)obj).Id == Id;
        // or: 
        // var o = (Person)obj;
        // return o.Id == Id && o.Name == Name;
    }
    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

然后调用:

List<Person> distinctList = new[] { person1, person2, person3 }.Distinct().ToList();

你可以这样做(虽然不是闪电般快):

people.Where(p => !people.Any(q => (p != q && p.Id == q.Id)));

也就是说,“选择列表中没有其他具有相同ID的人的所有人。”

注意,在你的例子中,这只会选择第3个人。我不知道怎么分辨你想要的是哪一个。

您可以使用DistinctBy()通过对象属性获取Distinct记录。只需在使用它之前添加以下语句:

使用Microsoft.Ajax.Utilities;

然后像这样使用它:

var listToReturn = responseList.DistinctBy(x => x.Index).ToList();

其中'Index'是我想要的数据是不同的属性。

Use:

List<Person> pList = new List<Person>();
/* Fill list */

var result = pList.Where(p => p.Name != null).GroupBy(p => p.Id)
    .Select(grp => grp.FirstOrDefault());

where帮助您筛选条目(可能更复杂),groupby和select执行不同的功能。

如果你想让它看起来像linq,你也可以使用查询语法:

var uniquePeople = from p in people
                   group p by new {p.ID} //or group by new {p.ID, p.Name, p.Whatever}
                   into mygroup
                   select mygroup.FirstOrDefault();