从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的项目,它通常可以很好地工作。 实际性能取决于字符串的平均长度 – 如果您确实需要最大性能,则可以利用一些更强大的数据结构,例如尝试使插入更快。