2013-01-21 30 views
15
string[] lines3 = new string[100]; 
List<string> lines2 = new List<string>(); 
lines3 = Regex.Split(s1, @"\s*,\s*"); 

if (!lines2.Contains(lines3.ToString())) 
{ 
    lines2.AddRange(lines3.Distinct().ToArray()); 
} 

我已经检查了所有的空间等,但我仍然得到我的lines2重复值List避免增加重复元素的列表C#

我要在这里删除我重复值本身

+0

lines2是字符串遗憾的名单,而复制和粘贴代码 – vini

+0

犯了一个小错误也可以像= SBC两个字符串之间的空间BGP – vini

+2

你有没有考虑使用一个HashSet 不是List 为这种情况下,它会表现得好多了。 – bashmohandes

回答

18

你这检查:

if (!lines2.Contains(lines3.ToString())) 

无效。您正在检查您的lines2是否包含System.String[],因为lines3.ToString()会给您。您需要检查lines3中的物品是否存在于lines2中。

您可以迭代lines3中的每个项目,检查它是否存在于lines2中,然后添加它。就像是。

foreach (string str in lines3) 
{ 
    if (!lines2.Contains(str)) 
     lines2.Add(str); 
} 

或者,如果你lines2任何空列表,那么你可以简单的lines3不同的值添加到列表中,如:

lines2.AddRange(lines3.Distinct()); 

那么你lines2将包含不同的值。

3

如果您不想在列表中使用重复项,请使用HashSet。通过这种方式,读取代码的人将会清楚你的意图是什么,并且由于HashSet已经处理了你正在尝试做的事情,所以你的代码更少。

+1

对于那些考虑hashset请注意,你不能保证顺序 – BKSpurgeon

1

如果您的支票已经起作用,它可能会添加所有项目,或者根本没有。但是,在数组上调用ToString方法将返回数据类型的名称,而不是数组的内容,并且Contains方法只能查找单个项目,而不是任何项目的集合。

你必须检查数组中的每个字符串:

string[] lines3; 
List<string> lines2 = new List<string>(); 

lines3 = Regex.Split(s1, @"\s*,\s*"); 

foreach (string s in lines3) { 
    if (!lines2.Contains(s)) { 
    lines2.Add(s); 
    } 
} 

但是,如果你开始与一个空的列表,你可以使用Distinct方法来删除重复的,而你只需要单行代码:

List<string> lines2 = Regex.Split(s1, @"\s*,\s*").Distinct().ToList(); 
23

您可以使用Enumerable.Except摆脱lines3不同的项目是不是在lines2:

lines2.AddRange(lines3.Except(lines2)); 

如果lines2包含来自lines3的所有项目,则不会添加任何内容。 BTW内部除使用Set<string>从第二个序列中获取不同的项目并验证第一个序列中存在的项目。所以,它非常快。

1

你可以使用一个简单的Union + Distinct

var lines = lines2.Union(lines3).Distinct(); 

这将增加所有项目从第二个列表进入第一个列表,然后返回组合列表中的所有唯一的字符串。大型列表不太可能表现良好,但很简单。

参考:http://msdn.microsoft.com/en-us/library/bb341731.aspx

1

如果你想不同的值保存到一个集合,你可以尝试HashSet Class。它会自动删除重复值并节省您的编码时间。 :)

19

使用HashSet<string>而不是List<string>。它准备好执行更好的性能,因为您不需要提供任何项目的检查。该集合将为您管理它。这是listset之间的差异。对于样品:

HashSet<string> set = new HashSet<string>(); 

set.Add("a"); 
set.Add("a"); 
set.Add("b"); 
set.Add("c"); 
set.Add("b"); 
set.Add("c"); 
set.Add("a"); 
set.Add("d"); 
set.Add("e"); 
set.Add("e"); 

var total = set.Count; 

总是5,值是abcde

List<T>的实现不会给你nativelly。你可以做到,但你必须提供这种控制。对于样本,这extension method

public static class CollectionExtensions 
{ 
    public static void AddItem<T>(this List<T> list, T item) 
    { 
     if (!list.Contains(item)) 
     { 
      list.Add(item); 
     } 
    } 
} 

,并使用它:

var list = new List<string>(); 
list.AddItem(1); 
list.AddItem(2); 
list.AddItem(3); 
list.AddItem(2); 
list.AddItem(4); 
list.AddItem(5); 
+0

请记住,'HashSet'是无序的,这意味着它不保留项目添加的顺序。如果他需要保留特定的订单,'HashSet'将不起作用。 –

0

使用沿着HashSetList

List<string> myList = new List<string>(); 
HashSet<string> myHashSet = new HashSet<string>(); 

public void addToList(string s) { 
    if (myHashSet.Add(s)) { 
     myList.Add(s); 
    } 
} 

myHashSet.Add(s)将返回true如果s它是不存在的。

0

不是一个好方法,但有一种快速修复, 采取布尔来检查是否在整个列表中有任何重复的条目。

bool containsKey; 
string newKey; 

    public void addKey(string newKey){ 

     foreach(string key in MyKeys){ 
      if(key == newKey){ 
      containsKey = true; 
      } 
     } 

     if(!containsKey){ 
     MyKeys.add(newKey); 
    }else{ 
     containsKey = false; 
    } 

    }