2011-01-20 9 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

+0

'code' 속성의 타입은 무엇입니까? 문자열이나 일종의 컬렉션입니까? (그리고'codesCareAbout'은 나에게 줄처럼 보입니다. 맞습니까?) – LukeH

+0

관련이 있지만 동일하지 않습니다 : http://stackoverflow.com/questions/4718725/best-practice-to-avoid-invalidoperationexception-collection-was- –

답변

4

당신에게 목록을 거꾸로 반복 할 수 있으며 목록에서 제거하려면 for 색인을 사용하여 RemoveAt을 사용하십시오.

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

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

열거 형으로 열거 된 목록을 변경할 수 없으므로 for 루프를 사용해야 인덱스를 바꿔야하므로 거꾸로 계산해야합니다.

또는 제안한대로 빈 목록에 원하는 항목을 채우십시오. 그러나 사용법은 사용자가 지정한 목록을 수정해야하는지 아니면 새 목록을 만들 수 있는지에 따라 달라집니다.

+0

이 예에서 Adam을 작동 시키려면 IsFooBar에서 어떤 일이 발생하는지 명확히하기 위해? 고마워, – JamesRadford

+0

@JamesRadford 사과, 나는 제거 할 항목을 결정하는 방법에 대한 질문에 대답하지 않았습니다. 단지 목록에서 제거하는 방법에 대해서는 상당히 깨끗합니다. –

0

Vehicule 코드 (문자열) 특성 및 설명 속성이 있다고 가정하면 (질문이 명확하지 않다!).

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

아하, Soverflow에 다소 새로운 ... – JamesRadford

+0

"답변"으로 표시하려면 녹색 체크 상자를 클릭해야합니다 대답의 왼쪽에 윤곽을 그리십시오. – JYL

0

는 LINQ와 함께 목록을 필터링하여 깨끗한 코드를 생성합니다 :

IsInteresting는

이 두 필드 오히려 문자열보다 모음 가정
codesIcareAbout.Intersect(v.Codes).Any(); 

로 구현 될 수 있지만이 쉽게 고정되어

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

string.Split()를 호출하십시오.

관련 문제