C# Lambda表达式查找差异

C# Lambda表达式查找差异,c#,lambda,deferred-query,C#,Lambda,Deferred Query,使用以下数据 string[] data = { "a", "a", "b" }; 我非常希望找到重复项并得到以下结果: a 我尝试了以下代码 var a = data.Distinct().ToList(); var b = a.Except(a).ToList(); 显然,这不起作用,我可以看到上面发生了什么,但我不知道如何修复它 对数据进行排序,迭代并记住最后一项。当当前项目与最后一个项目相同时,它是重复的。这可以通过迭代或使用O(n*log(n))时间内的lambda表达式轻松实现

使用以下数据

string[] data = { "a", "a", "b" };
我非常希望找到重复项并得到以下结果:

a
我尝试了以下代码

var a = data.Distinct().ToList();
var b = a.Except(a).ToList();

显然,这不起作用,我可以看到上面发生了什么,但我不知道如何修复它

对数据进行排序,迭代并记住最后一项。当当前项目与最后一个项目相同时,它是重复的。这可以通过迭代或使用O(n*log(n))时间内的lambda表达式轻松实现。

当运行时没有问题时,您可以使用

var duplicates = data.Where(s => data.Count(t => t == s) > 1).Distinct().ToList();
好老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;
            }
        }
    }
}

使用分组方式,这些方法的性能相当好。如果您使用的是大数据集,唯一需要考虑的是大内存开销

from g in (from x in data group x by x)
where g.Count() > 1 
select g.Key;
--或者如果您更喜欢扩展方法

data.GroupBy(x => x)
    .Where(x => x.Count() > 1)
    .Select(x => x.Key)
其中
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;

创建分组时,将创建一组集合。假设它是一个插入了
O(1)
的集合,则分组方法的运行时间是
O(n)
。每个操作产生的成本有些高,但它应该相当于接近线性性能。

使用哈希集的好解决方案。我一直在思考这些问题,但显然还没有醒悟……哈希集确实是一个很好的解决方案!我知道我可以这样做,但不知道这样扩展语言是可能的!这就是我想做的,但我正在学习如何编写lambdas,而如何编写并不明显。我会投票支持你,但需要15次代表才能做到这一点(!)很好的例子:)如果你愿意,你可以更改你喜欢的答案。
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;