2012-03-13 162 views
6

我必須刪除組合框中的重複項。刪除組合框中的重複項

private void cbnama_Click(object sender, EventArgs e) 
{ 
    List<string>[] list; 
    list = mDatabase.Viewpengujian(); 

    cbnama.Items.Clear(); 
    for (int i = 0; i < list[0].Count; i++) 
    { 
      cbnama.Items.Add(list[0][i]); 
    } 
} 

例子:

test1 
test2 
test2 
test3 
test3 
+1

你是從數據庫拉這個,那麼它將是很好的有獨特的從那裏拉出 – V4Vendetta 2012-03-13 10:31:59

回答

5

更新:沒有注意到你有一個多維列表。 @ntziolis是第一個知道的人,他的回答是正確的。

如果您正在使用C#3.0或更高版本,你可以這樣做:

list = list.SelectMany(i => i).Distinct().ToList(); 

請確保您有在頂部using System.Linq

+0

我使用C#4.0 – bessie 2012-03-13 10:32:16

+0

這將不編譯,因爲Distinct將返回一個IEnumerable <>,你必須cast:list.Distinct ().ToList() – KrazZ88 2012-03-13 10:36:59

+0

剛剛意識到他在列表上使用多個維度,所以只是調用'Distinct'在這裏不工作,他需要'SelectMany'在這之前,看到我的回答 – ntziolis 2012-03-13 10:38:27

2

u需要檢查已經添加的項目或沒有下文,shich跳過這是在組合框中

for (int i = 0; i < list[0].Count; i++)  
{     

    if (!comboBox1.Items.Contains(list[0][i])) 
    { 
     cbnama.Items.Add(list[0][i]);  
    } 
} 
+0

一個應該避免使用UI元素來檢查這樣的事情,通常是使用UI元素而不是像數組這樣的輕量級數據結構時,有一個很大的開銷,它也不分隔代碼和UI正確 – ntziolis 2012-03-13 10:42:39

0

已經添加的項目只是檢查這個例子....並操縱它按照烏拉圭回合的需要。 ..

For i As Int16 = 0 To Me.ComboBox1.Items.Count - 2 
    For j As Int16 = Me.ComboBox1.Items.Count - 1 To i + 1 Step -1 
      If Me.ComboBox1.Items(i).ToString = Me.ComboBox1.Items(j).ToString Then 
       Me.ComboBox1.Items.RemoveAt(j) 
      End If 
    Next 
Next 
2

一般來說,這可以通過使用了IEnumerable的Distinct擴展方法來解決,在這裏看到:
http://msdn.microsoft.com/en-us/library/bb348436.aspx

但因爲你正在使用你需要SelectMany扁平化你的尺寸,你可以調用Distinct前一多維列表/陣列的事情,這也改變了你的代碼的其餘部分略微所以這裏是孔法:

private void cbnama_Click(object sender, EventArgs e) 
{ 
    // this will give you an IEnumerable<string> 
    var list = mDatabase.Viewpengujian() 
     .SelectMany(i => i) 
     .Distinct(); 

    cbnama.Items.Clear(); 

    // since now list is a IEnumerable<string> you can just loop through it 
    foreach (var item in list) 
    { 
     cbnama.Items.Add(item); 
    } 
}