[C#] 如何使用LINQ从列表中获取重复的项目?


Answers

这是一种方法:

List<String> duplicates = lst.GroupBy(x => x)
                             .Where(g => g.Count() > 1)
                             .Select(g => g.Key)
                             .ToList();

GroupBy将相同的元素分组在一起,而Where过滤掉那些只出现一次的元素,只留下重复项。

Question

我有一个List<string>就像:

List<String> list = new List<String>{"6","1","2","4","6","5","1"};

我需要将列表中的重复项目放入新列表中。 现在我正在使用嵌套for循环来做到这一点。

结果list将包含{"6","1"}

有没有想法使用LINQlambda表达式来做到这一点?




我试图用一系列对象来解决这个问题,并且遇到了问题,因为我试图将组列表重新包装到原始列表中。 所以我想出了通过组循环来重新包装具有重复项目的原始列表。

public List<MediaFileInfo> GetDuplicatePictures()
{
    List<MediaFileInfo> dupes = new List<MediaFileInfo>();
    var grpDupes = from f in _fileRepo
                   group f by f.Length into grps
                   where grps.Count() >1
                   select grps;
    foreach (var item in grpDupes)
    {
        foreach (var thing in item)
        {
            dupes.Add(thing);
        }
    }
    return dupes;
}



我知道这不是原始问题的答案,但是您可能会发现自己在这里遇到了这个问题。

如果你想要结果中的所有重复项目,下面的工作。

var duplicates = list
    .GroupBy( x => x )               // group matching items
    .Where( g => g.Skip(1).Any() )   // where the group contains more than one item
    .SelectMany( g => g );           // re-expand the groups with more than one item

在我的情况下,我需要所有重复项,以便在UI中将它们标记为错误。




  List<String> list = new List<String> { "6", "1", "2", "4", "6", "5", "1" };

    var q = from s in list
            group s by s into g
            where g.Count() > 1
            select g.First();

    foreach (var item in q)
    {
        Console.WriteLine(item);

    }