检查List<>中的重复项

时间:2014-02-27 00:31:20

标签: c# list duplicates

我需要检查并显示List<>中包含的所有重复内容。集合。

//Check for duplicate items
foreach (string y in myListCollection)
{
    if (myListCollection.FindAll(x => x.Contains(y)).Count > 1)
    {
        foreach (string path in myListCollection.FindAll(x => x.Contains(y)))
        {
            listbox1.items.add(path);
        }
    }
}

但这会返回整个列表。我做错了什么?

3 个答案:

答案 0 :(得分:7)

您可以改为使用LINQ

myListCollection.GroupBy(x => x)
         .Where(x => x.Count() > 1)
         .Select(x => x.Key)
         .ToList();

首先group所有项目的值,然后从包含多个项目的组中获取每个项目。

您正在使用包含它不会返回完全重复项目的内容进行搜索。例如,如果您有hellhello,它会将hello添加到listBox甚至如果它不是重复的。相反,你应该检查是否相等:

foreach (string y in myListCollection)
{
   if (myListCollection.FindAll(x => x == y).Count > 1)
   {
        listbox1.Items.add(y);
   }
}

我认为你不需要那个嵌套的foreach循环。无论如何,上面的代码会添加重复的项目但仍然不完全正确。如果你有四个hell它会添加四个helllistBox。要解决此问题,您可以使用Distinct,或者您可以检查该项目是否已添加,但您不需要。只需使用上面显示的GroupBy。您也可以使用List<T>.ForEach方法将所有项目添加到listBox,如下所示:

myListCollection.GroupBy(x => x)
         .Where(x => x.Count() > 1)
         .Select(x => x.Key)
         .ToList()
         .ForEach(x => listBox1.Items.Add(x));

答案 1 :(得分:0)

没有Linq Soln。

当空间不是约束时,使用附加词典是另一种方式:速度:O(n)

using System.IO;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Read in every line in the file.
        List<string> myListCollection = new List<string>();
        myListCollection.Add("hi");
        myListCollection.Add("aa");
        myListCollection.Add("hi");
        myListCollection.Add("hello");
        myListCollection.Add("hello");
        Dictionary<string,int> dtCollection  = new Dictionary<string,int>();
        List<string> myDups = new List<string>();

        foreach (string y in myListCollection)
        {
            if(dtCollection.ContainsKey(y))
            {
                            Console.WriteLine(y);

            }else{
                dtCollection.Add(y,1);
            }
        }
    }
}

答案 2 :(得分:0)

List<string> list= new List<string>();

for (int i =0 ; i< list.Count(); i++)
{
   for(int k = 0 ; k< list.Count(); k++)
   {
     if(list[i] == list[k])
     {
        list.RemoveAt(k);
         or do something ....///
     }
   }
}