2013-01-21 29 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; 
    } 

    }