从List中删除重复的字符串(.NET 2.0!)

我有问题找到从字符串列表中删除重复项的最有效方法(List)。

我当前的实现是一个双foreach循环,检查每个对象的实例计数只有1,否则删除第二个。

我知道还有其他许多问题,但是他们所有最好的解决方案都需要上面的.net 2.0,这是我正在使用的当前构建环境。(GM和克莱斯勒非常不愿意改变… :))

这限制了可能的结果,因为不允许任何LINQ或HashSets。

我正在使用的代码是Visual C ++,但C#解决方案也可以正常工作。

谢谢!

这可能不是你想要的,但如果你能控制它,最有效的方法是不首先添加它们……

你有控制权吗? 如果是这样,你需要做的就是在添加项目之前调用myList.Contains(currentItem)并设置

您可以执行以下操作。

 List list = GetTheList(); Dictionary map = new Dictionary(); int i = 0; while ( i < list.Count ) { string current = list[i]; if ( map.ContainsKey(current) ) { list.RemoveAt(i); } else { i++; map.Add(current,null); } } 

这具有构建Dictionary对象的开销,该对象将复制列表中的唯一值列表。 但它速度相当快。

我不是Comp Sci PhD,但是我想要使用字典,列表中的项目因为键很快。

由于字典不允许重复键,因此在迭代结束时只有唯一的字符串。

只需记住提供自定义类来覆盖Equals()方法,以便Contains()按需要运行。

 List clz = new List() public class CustomClass{ public bool Equals(Object param){ //Put equal code here... } } 

如果你要去“只是不添加重复项”的路线,那么在添加项目之前检查“List.Contains”是有效的 ,但是它的O(n ^ 2)其中n是你想要添加的数字字符串。 它与使用两个嵌套循环的当前解决方案没有什么不同。

使用散列集来存储已经添加的项目会更好,但是由于您使用的是.NET 2.0,因此Dictionary可以替换散列集:

 static List RemoveDuplicates(List input) { List result = new List(input.Count); Dictionary hashSet = new Dictionary(); foreach (T s in input) { if (!hashSet.ContainsKey(s)) { result.Add(s); hashSet.Add(s, null); } } return result; } 

它在O(n)中运行并使用O(2n)空间,对于多达100K的项目,它通常可以很好地工作。 实际性能取决于字符串的平均长度 – 如果您确实需要最大性能,则可以利用一些更强大的数据结构,例如尝试使插入更快。