use*_*049 5 c# lambda deferred-query
有以下数据
string[] data = { "a", "a", "b" };
Run Code Online (Sandbox Code Playgroud)
我非常想找到重复项并得到这个结果:
a
Run Code Online (Sandbox Code Playgroud)
我尝试了以下代码
var a = data.Distinct().ToList();
var b = a.Except(a).ToList();
Run Code Online (Sandbox Code Playgroud)
显然这不起作用,我可以看到上面发生了什么,但我不知道如何解决它.
Jen*_*ens 11
当运行时没问题时,您可以使用
var duplicates = data.Where(s => data.Count(t => t == s) > 1).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)
好老O(n ^ n)=)
编辑:现在寻求更好的解决方案.=)如果你定义一个新的扩展方法,如
static class Extensions
{
public static IEnumerable<T> Duplicates<T>(this IEnumerable<T> input)
{
HashSet<T> hash = new HashSet<T>();
foreach (T item in input)
{
if (!hash.Contains(item))
{
hash.Add(item);
}
else
{
yield return item;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用
var duplicates = data.Duplicates().Distinct().ToArray();
Run Code Online (Sandbox Code Playgroud)
使用group by stuff,这些方法的表现相当不错.如果您正在处理大型数据集,那么唯一需要考虑的是大量内存开销.
from g in (from x in data group x by x)
where g.Count() > 1
select g.Key;
Run Code Online (Sandbox Code Playgroud)
- 或者如果您更喜欢扩展方法
data.GroupBy(x => x)
.Where(x => x.Count() > 1)
.Select(x => x.Key)
Run Code Online (Sandbox Code Playgroud)
当Count() == 1这是你的不同项目,并在那里Count() > 1这是一个或多个重复的项目.
由于LINQ是一种懒惰的,如果你不想重新评估你的计算,你可以这样做:
var g = (from x in data group x by x).ToList(); // grouping result
// duplicates
from x in g
where x.Count() > 1
select x.Key;
// distinct
from x in g
where x.Count() == 1
select x.Key;
Run Code Online (Sandbox Code Playgroud)
创建分组时,将创建一组集.假设它是一个带O(1)插入的集合,则该方法的运行时间是O(n).每次操作产生的成本都有些高,但它应该等于接近线性的性能.