2012-01-11 63 views
1

我想從列表中刪除滿足特定條件的項目。我做了一個例子,我到目前爲止:從列表中刪除項目(.net 2.0)

//remove 1´s and 3´s from list of ints 

List<int> indexes = new List<int>(); 
List<int> ints = new List<int>(); 
ints.Add(1); 
ints.Add(2); 
ints.Add(3); 

foreach (int i in ints) 
{ 
    if(i == 1 || i == 3) 
    indexes.Add(ints.IndexOf(i)); 
} 

indexes.Reverse(); 

foreach (int index in indexes) 
{ 
    ints.RemoveAt(index); 
} 

我很好奇,如果解決方案可以優化?我不能使用System.Linq的,我只找到了System.Data.Linq命名空間爲參考(Visual Studio 2005中)

UPDATE

我更好地貼過我真正的代碼。它是關於從gridview刪除列

List<int> indexes = new List<int>(); 

foreach (Type type in types) 
{ 
    foreach (DataControlField c in entriesGrid.Columns) 
    { 
      string header = c.HeaderText; 
      if (header == type.Name) 
      { 
       indexes.Add(entriesGrid.Columns.IndexOf(c)); 
      } 
    } 
} 
+1

......如果解決方案是好的,你當然應該保留的問題。這是網站的重點。 – 2012-01-11 15:25:43

回答

3

爲什麼不使用List<T>.RemoveAll()

ints.RemoveAll(IsOneOrThree); // Remove all 1's or 3's 

private static bool IsOneOrThree(int i) 
{ 
    return i == 1 || i == 3; 
} 

如果它不是那麼簡單(猜測是真的不行,你可以試試):

for(int i= ints.Count - 1; i >= 0; i--) 
{ 
    if(ints[i] == 1 || ints[i] == 3) 
     ints.RemoveAt(i); 
} 

這樣可以節省你一個列表,並多次迭代的成本。

+0

你是對的,我只是用整數作爲例子,但無論如何感謝 – AGuyCalledGerald 2012-01-11 15:17:41

+0

@ Jan-Frederik Carl - 查看第二個使用單個反向循環移除符合條件的項目的示例。 – 2012-01-11 15:18:26

0

嘗試removeall過:

public bool MyPredicate(int i){ 
    return i == 3 || i == 5; 
} 

ints.RemoveAll(MyPredicate); 

,或者如果你有機會獲得匿名委託:

ints.RemoveAll((i) => i == 3 || i == 5); 

此外,它通常不是一個好主意,從SO刪除您的問題,所以,在未來可能有同樣問題的人可以閱讀並從中學習。

爲removeall過