2012-01-17 87 views
1

我有一個對象的集合,我希望從其中刪除一些基於函數調用將返回true或false的對象。請參閱下面的示例代碼snipette -從集合中刪除對象

for each(MyClass obj in Objects) 
{ 
    if(!ValidateObject(obj) 
    { Objects.Remove(obj); } 
} 

我不想在這裏使用循環。需要一個以上樣本的班輪碼。 在此先感謝。

+0

你需要更加準確。 1st - 「Objects」是「MyClass」的集合嗎?第二 - 你到目前爲止嘗試過什麼?第三 - 有什麼問題?再說一遍,如果你沒有清楚地問問題,那聽起來好像有人需要做你的功課! ;) – 2012-01-17 13:32:10

+1

你可能想解釋「我不想在這裏使用循環」的原因。最終,每個解決方案都需要遍歷所有項目,刪除不需要的內容。 – 2012-01-17 13:52:21

+0

@HansKesting我想他的研究背後沒有任何技術原因,只是以較少的行數來完成。 – 2012-01-17 14:09:47

回答

3

枚舉枚舉時無法修改集合。

嘗試使用LINQ:

var validObjects = Objects.Where(z => ValidateObject(z)); 
+0

[回答已刪除的答案]從我從OP的問題中瞭解到的情況,他想刪除對象並且「不想在此使用循環」。 好,這裏沒有使用Linq的循環。這回答了這個問題。 – ken2k 2012-01-17 13:36:16

+0

我不這麼認爲,Linq也會循環。好吧,'Where'在單行中做了一個循環,但它又是一個循環。 – 2012-01-17 13:46:30

+0

你的代碼很混亂,因爲你的obj變量代表了多個對象。此外,您的代碼獲取有效的對象,而不是無效的,並且不會刪除它們。 – 2012-01-17 13:46:53

0

使用此過濾出有效對象:

var validObjects = Objects.Where(t=>ValidateObject(obj)); 
+0

我沒有發現使用Linq或'for-each'迭代器的任何區別,它沒有解決任何問題。 – 2012-01-17 13:34:25

+0

@MatíasFidemraizer - 你可以解釋一下,如果它過濾了集合並且沒有使用循環,它怎麼樣? – 2012-01-17 13:42:16

+0

@GarryVass是的,你是對的,我錯過了「單行」的事情,但順便說一下,你認爲你的答案能夠解決「在一行中刪除一個對象從這個集合中」? – 2012-01-17 13:44:15

5

,如果你使用的是列表

public int RemoveAll(
    Predicate<T> match 
) 
RemoveAll法斷言會做

The Predicate(Of T)代表它定義了要移除的元素的條件。

List<MyClass > f = new List<MyClass >(); 
f.RemoveAll(x => ! ValidateObject(x)); 
+0

+1,但我認爲目標是移除ValidateObject返回false的對象:!ValidateObject(x) – 2012-01-17 13:39:55

+0

@Meta - 我剛糾正它:) – 2012-01-17 13:40:14

1

畢竟,有沒有辦法,它的類型是IEnumerable<T>ICollection<T>左右可以消除基於某些條件的項目集合。

但是你可以創建一個擴展方法是這樣的:

public static void CollectionsExtensions 
{ 
     public static void RemoveInvalidItems(this ICollection<MyClass> some) 
     { 
      foreach(MyClass item in some.ToList()) 
      { 
        if(!new Validator().ValidateObject(item)) // Your class having your validation method 
        { 
          some.Remove(item); 
        } 
      } 
     } 
} 

所以,在這一天結束時,你可以將你的循環去除無效對象爲:

someCollectionOfMyClass.RemoveInvalidItems(); 

摘要:你可以刪除所有無效的項目在單行實施ICollection<MyClass>任何集合,其中包括一些像:

  • IList<T>
  • List<T>
  • 以上!