我需要检查并显示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);
}
}
}
但这会返回整个列表。我做错了什么?
答案 0 :(得分:7)
您可以改为使用LINQ
:
myListCollection.GroupBy(x => x)
.Where(x => x.Count() > 1)
.Select(x => x.Key)
.ToList();
首先group
所有项目的值,然后从包含多个项目的组中获取每个项目。
您正在使用包含它不会返回完全重复项目的内容进行搜索。例如,如果您有hell
和hello
,它会将hello
添加到listBox
甚至如果它不是重复的。相反,你应该检查是否相等:
foreach (string y in myListCollection)
{
if (myListCollection.FindAll(x => x == y).Count > 1)
{
listbox1.Items.add(y);
}
}
我认为你不需要那个嵌套的foreach
循环。无论如何,上面的代码会添加重复的项目但仍然不完全正确。如果你有四个hell
它会添加四个hell
到listBox
。要解决此问题,您可以使用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 ....///
}
}
}