2011-01-20 19 views
2

我遇到了以下問題。我有一個集合:迭代收集和刪除我不想要

Collection<Vehicle> list = new Collection<Vehicle>(); 

code = 1,2,3, Description = "aaa" 
code = 10,438,13, Description = "bbb" 
code = 81,8623,362, Description = "ccc" 
code = 163,4312,53, Description = "ddd" 
... 

但我只關心其中的一些。我關心的列表在這裏,即codesCareAbout = 「1 | 2 | 3 | 163 | 4312 | 53」

我需要遍歷集合並刪除我不關心的車輛,或者櫻桃選擇到包含我關心的車輛的另一個列表中?

有什麼建議嗎?

非常感謝, 詹姆斯

+3

代碼的數據類型是什麼? – Novice 2011-01-20 11:27:29

+0

`code`屬性的類型是什麼?它是一個字符串還是某種集合? (而且`codesCareAbout`看起來像是一個字符串,對嗎?) – LukeH 2011-01-20 11:29:13

+0

相關但不一樣:http://stackoverflow.com/questions/4718725/best-practice-to-avoid-invalidoperationexception-collection-was-修改 – 2011-01-20 11:33:21

回答

4

你可以向後迭代列表,並使用RemoveAt使用for索引從列表中刪除:

for (int i = list.Count - 1; i >= 0; i--) 
{ 
    Foo item = list[i]; 

    if (IsFoobar(item)) 
     list.RemoveAt(i); 
} 

倒計數是必需的,這樣,你去你不發生變異索引計數,使用,因爲你不能變異被枚舉與枚舉列表中的for循環是必需的。

或者,按照您的建議,將您想要的東西填充到空列表中 - 但是,使用情況取決於您是需要修改給定列表還是可以創建新列表。

0

假設VEHICULE具有代碼(String)屬性和Description屬性(問題不明確!)。

1 /克隆名單:var clone = list.ToList();

2 /迭代,並決定,如果目前的項目是有趣:

foreach(var item in clone) 
{ 
    if (! IsInteresting(item)) 
     list.Remove(item); 
} 

3/IsInteresting可能是,例如:

foreach(var code in item.Code.Split(',')) 
{ 
    if (codesCareAbout.Split('|').Contains(code)) 
     return true; 
} 
0

與LINQ過濾列表產生乾淨的代碼:

var interestinglist = list.Where(v=> v.IsInteresting(v)); 

IsInteresting可以被實現爲

codesIcareAbout.Intersect(v.Codes).Any(); 

這假定這兩個字段是集合而不是字符串,而是很容易固定有調用string.Split()。