我正在尝试在Linq中使用.distinct来获取基于表的一个字段的结果(因此不需要表中的整个重复记录)。
我知道使用distinct来编写基本查询:
var query = (from r in table1
orderby r.Text
select r).distinct();
但我需要r.text
不重复的结果。
答案 0 :(得分:246)
试试这个:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
这会将表格按Text
分组,并使用每个组中的第一行,从而产生Text
不同的行。
答案 1 :(得分:17)
MoreLinq有一个DistinctBy方法可以使用:
它允许你这样做:
var results = table1.DistictBy(row => row.Text);
方法的实现(缺少参数验证)如下:
private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
答案 2 :(得分:11)
但我需要r.text不重复的结果
听起来好像你想要这个:
table1.GroupBy(x => x.Text)
.Where(g => g.Count() == 1)
.Select(g => g.First());
这将选择Text
唯一的行。
答案 3 :(得分:3)
关于这个主题有很多讨论。
您可以找到其中一个here:
最受欢迎的建议之一是使用lambda表达式作为@Servy指出的参数的Distinct方法。
C#的首席架构师Anders Hejlsberg提出了解决方案here。还解释了为什么框架设计团队决定不添加带有lambda的Distinct方法的重载。
答案 4 :(得分:3)
Daniel Hilgarth上面的回答会导致System.NotSupported
异常与实体框架。使用实体框架,必须是:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
答案 5 :(得分:2)
根据我的发现,您的查询大多是正确的。只需更改&#34;选择r&#34;到&#34;选择r.Text&#34;是所有,这应该解决问题。这就是MSDN记录它应该如何工作的方式。
例如:
var query = (from r in table1 orderby r.Text select r.Text).distinct();
答案 6 :(得分:1)
data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });
答案 7 :(得分:-2)
试试这段代码:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
答案 8 :(得分:-4)
您可以尝试:table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();