首页 > 解决方案 > 删除多次出现的重复项

问题描述

只是在 linq 上练习了一下,我正在做通常的删除项目,这些项目只会重复一次以上,所以在下面的例子中我有。

字 1 字 2 字 1

它应该只打印出单词 2 这是一个https://dotnetfiddle.net/P47DGT是他们更好地使用 Lambada 的一种简单方法。

class Words {
    public string MyWords { get; set; }
}

public class Program    
{
    public static void Main()
{
  List<Words> _words = new List<Words>();
  _words.Add(new Words() { MyWords = "word1" });
  _words.Add(new Words() { MyWords = "word2" });
  _words.Add(new Words() { MyWords = "word1" });

   RemoveDuplicatesLinq(_words);
}   
    static void RemoveDuplicatesLinq(List<Words> _words) {
        List<Words> duplicatesRemoved = new List<Words>();
        duplicatesRemoved = _words.GroupBy(x => x)
                    .Where(group => group.Count() > 1)
                    .Select(group => group.Key).ToList();  
        foreach (var item in duplicatesRemoved) {
            Console.Write("Words Left " + item.MyWords + "\r\n");
        }
    }       
}

它应该只打印出一次出现的 Word2 但它不是

标签: c#listlinq

解决方案


您应该只分组MyWords并仅过滤长度为 1 的组。然后您可以将组展平为IEnumerable<Words>with System.Linq.Enumerable.SelectMany。由于您似乎想要一个列表,我们可以添加ToList()以将结果转换为List<Words>.

List<Words> duplicatesRemoved = _words
            .GroupBy(x => x.MyWords)
            .Where(group => group.Count() == 1)
            .SelectMany(group => group)
            .ToList();

foreach (var item in duplicatesRemoved)
{
    Console.Write("Words Left " + item.MyWords + "\r\n");
}

哪些输出:

Words Left word2

推荐阅读