Lambda表达式找到差异

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)


Joh*_*ren 5

使用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).每次操作产生的成本都有些高,但它应该等于接近线性的性能.