.jpg)
我正在使用 LINQ 来了解它,但是当我没有简单的列表时,我无法弄清楚如何使用(简单的整数列表很容易做到,这不是问题)。我想在 的一个或多个属性上使用什么?DistinctDistinctList<TElement>TElement
示例:如果对象是 ,则带有属性 。如何获取所有内容并使用对象的属性?PersonIdPersonDistinctId
Person1: Id=1, Name="Test1"
Person2: Id=1, Name="Test1"
Person3: Id=2, Name="Test2"
我怎样才能得到公正和?这可能吗?Person1Person3
如果 LINQ 无法实现,那么根据其某些属性列出列表的最佳方法是什么?Person

网友回答:
编辑:这现在是MoreLINQ的一部分。
你需要的是一个有效的“区分”。我不相信它是 LINQ 的一部分,尽管编写起来相当容易:
public static IEnumerable<TSource> DistinctBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (seenKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
因此,若要仅使用属性查找非重复值,可以使用:Id
var query = people.DistinctBy(p => p.Id);
要使用多个属性,可以使用匿名类型,这些类型适当地实现相等:
var query = people.DistinctBy(p => new { p.Id, p.Name });
未经测试,但它应该可以工作(现在至少可以编译)。
不过,它假定键的默认比较器 – 如果要传入相等比较器,只需将其传递给构造函数即可。HashSet

网友回答:
如果我想基于一个或多个属性获取不同的列表,该怎么办?
简单!您想对他们进行分组并从组中选出一个获胜者。
List<Person> distinctPeople = allPeople
.GroupBy(p => p.PersonId)
.Select(g => g.First())
.ToList();
如果要在多个属性上定义组,方法如下:
List<Person> distinctPeople = allPeople
.GroupBy(p => new {p.PersonId, p.FavoriteColor} )
.Select(g => g.First())
.ToList();
注意:某些查询提供程序无法解析每个组必须至少有一个元素,并且 First 是在这种情况下调用的适当方法。如果您发现自己正在使用此类查询提供程序,FirstOrDefault 可能会帮助您通过查询提供程序获取查询。
注意 2:对于 EF 核心(在 EF Core 6 之前)兼容的方法,请考虑此答案。https://stackoverflow.com/a/66529949/8155

网友回答:
用:
List<Person> pList = new List<Person>();
/* Fill list */
var result = pList.Where(p => p.Name != null).GroupBy(p => p.Id)
.Select(grp => grp.FirstOrDefault());
帮助您过滤条目(可能更复杂)和执行不同的功能。wheregroupbyselect
模板简介:该模板名称为【一个或多个属性上使用什么?Distinct DistinctList