Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在从列表(.NET 2.0!)中删除重复字符串_C#_.net_C++_List - Fatal编程技术网

C# 正在从列表(.NET 2.0!)中删除重复字符串

C# 正在从列表(.NET 2.0!)中删除重复字符串,c#,.net,c++,list,C#,.net,C++,List,我在寻找从字符串列表(列表)中删除重复项的最有效方法时遇到问题 我当前的实现是一个双foreach循环,检查每个对象的实例计数是否只有1,否则删除第二个 我知道还有很多其他的问题,但它们都是最好的解决方案所需要的.NET2.0以上的版本,这是我目前工作的构建环境。(通用和克莱斯勒非常抵制变革……:) 这通过不允许任何LINQ或哈希集来限制可能的结果 我使用的代码是Visual C++,但是C语言的解决方案也会很好。 谢谢 这可能不是你想要的,但是如果你能控制它,最有效的方法就是一开始就不添加它们

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

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

我知道还有很多其他的问题,但它们都是最好的解决方案所需要的.NET2.0以上的版本,这是我目前工作的构建环境。(通用和克莱斯勒非常抵制变革……:)

这通过不允许任何LINQ或哈希集来限制可能的结果

<>我使用的代码是Visual C++,但是C语言的解决方案也会很好。


谢谢

这可能不是你想要的,但是如果你能控制它,最有效的方法就是一开始就不添加它们


你能控制这一切吗?如果是这样的话,您需要做的就是在添加项目和设置项目之前调用myList.Contains(currentItem),您可以执行以下操作

List<string> list = GetTheList();
Dictionary<string,object> map = new Dictionary<string,object>();
int i = 0;
while ( i < list.Count ) {
  string current = list[i];
  if ( map.ContainsKey(current) ) {
    list.RemoveAt(i);
  } else {
    i++;
    map.Add(current,null);
  }
}
List List=GetTheList();
字典映射=新字典();
int i=0;
而(i

这需要构建一个
字典
对象,该对象将复制列表中的唯一值列表。但它在速度方面相当有效。

我不是工商科学博士,但我会想象使用字典,将列表中的项目作为键会很快


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

请记住,当提供一个自定义类来重写Equals()方法时,Contains()将按需要运行

范例

List<CustomClass> clz = new List<CustomClass>()

public class CustomClass{

    public bool Equals(Object param){
        //Put equal code here...
    }
}
List clz=新列表()
公共类CustomClass{
公共布尔等于(对象参数){
//把相等的代码放在这里。。。
}
}

如果您选择“只是不添加重复项”,则在添加项之前选中“List.Contains”,但它的O(n^2),其中n是要添加的数字字符串。它与当前使用两个嵌套循环的解决方案没有什么不同

使用哈希集来存储已添加的项会更幸运,但由于您使用的是.NET 2.0,字典可以替代哈希集:

static List<T> RemoveDuplicates<T>(List<T> input)
{
    List<T> result = new List<T>(input.Count);
    Dictionary<T, object> hashSet = new Dictionary<T, object>();
    foreach (T s in input)
    {
        if (!hashSet.ContainsKey(s))
        {
            result.Add(s);
            hashSet.Add(s, null);
        }
    }
    return result;
}
静态列表移除副本(列表输入)
{
列表结果=新列表(input.Count);
字典hashSet=新字典();
foreach(输入中的TS)
{
如果(!hashSet.ContainsKey)
{
结果。添加(s);
Add(s,null);
}
}
返回结果;
}

它在O(n)中运行,并使用O(2n)空间,通常可以很好地处理多达10万个项目。实际性能取决于字符串的平均长度——如果您真的需要最大限度地提高性能,您可以利用一些更强大的数据结构,例如尝试更快地进行插入。

Hah,我从未想过这一点,我可以控制初始列表的生成!请注意,随着列表大小的增加,这种方法不能很好地扩展…如果大小是一个问题,我认为您可以使用上面相同的方法,但使用与标准列表相反的SortedList是O(n^2),因为list.Contains是O(n)。你需要借用Jared的字典来跟踪你添加的项目,给出O(1)个检查和O(n)个总体。幸运的是,在这种特殊情况下,规模不是一个问题+1首先想到的是,在删除发现的重复项时,将每个值相互比较,但其复杂性是n^2。Jared的解决方案要好得多,因为通过使用双向数据结构,将使用散列,因此查找速度非常快。复杂度=N(logn)?如果速度很重要,你最好创建一个新的唯一值列表,而不是从原始列表中删除重复值,因为RemoveAt是O(N),而Add是O(1),当你事先知道最大长度时。HashSet是.net 3.5+,这超出了这个问题的范围。我的代码不使用HashSet,它使用了一个字典来代替HashSet。我应该更彻底地阅读您的代码,我只是看到了HashSet这个词,然后跳过了它。空值呢?Dictionary将为该键抛出ArgumentNullException。