2012-01-26 7 views
6

.NET 컬렉션 라이브러리의 목록이 있으며 단일 요소를 제거하려고합니다. 슬프게도 다른 개체와 직접 비교하여 찾을 수 없습니다.술어로 목록에서 요소 제거

FindIndexRemoveAt을 사용하면 목록이 여러 번 통과하게됩니다.

열거자를 사용하여 요소를 제거하는 방법을 모르겠습니다. 그렇지 않으면 작동하지 않을 수 있습니다.

RemoveAll 내가 필요한 것은 하나의 요소가 발견되면 멈추지 않을 것입니다.

아이디어가 있으십니까?

+0

몇 가지 예제 코드를 보여 주시겠습니까? –

+0

질문은'linked-list'로 태그가 붙었지만 그 설명은'List '을 제안합니다. 무엇 이니? – Ani

+0

귀하의 목록은 어떤 유형입니까? – Strillo

답변

1

편집 : 이제 영업 이익은 LinkedList<T>를 사용하도록 변경되었습니다, 그것은 대답을 쉽게하는 최대한 멀리에있다으로 만 반복 : 당신은 단지 요소를 제거하려면

public static void RemoveFirst<T>(LinkedList<T> list, Predicate<T> predicate) 
{ 
    var node = list.First; 
    while (node != null) 
    { 
     if (predicate(node.Value)) 
     { 
      list.Remove(node); 
      return; 
     } 
     node = node.Next; 
    } 
} 
+0

하나의 요소 만 제거하려고합니다. – Steinbitglis

+0

@Steinbitglis : 술어와 일치하는 값이 여러 개 있습니까? 어떤 종류의 목록을 사용하고 있습니까? –

+0

@Steinbitglis : 부작용을 사용하여'RemoveAll'을 사용하는 방법을 보여주기 위해 편집되었습니다. –

2

(x => x = 10) 분명히 개체를 일치에 대한 조건입니다

List<int> list = new List<int>(); 
list.Remove(list.FirstOrDefault(x => x = 10)); 

: 그 술어 다음 (예)를 사용할 수 있습니다 일치합니다.

+0

이렇게하려면 목록을 두 번 열거해야합니다. 한 번 일치하는 항목을 찾습니다. 이 항목을 '제거'에서 다시 한 번 찾으십시오. –

+1

사실, RemoveAt를 사용하는 것이 더 효율적입니다. – Strillo

10

List<T>

int index = words.FindIndex(s => s.StartsWith("x")); 
words.RemoveAt(index); 

은 "X"로 시작하는 단어를 삭제 제 술어 FindIndex받는 방법이있다. words은이 예제에서 List<string>으로 가정합니다.

+0

리스트에 상수 시간 인덱스 조회가있는 경우 이것이 괜찮을 것이라고 생각합니다. RemoveAt가 목록을 통과 할까봐 걱정했습니다. – Steinbitglis

+1

@Steinbitglis : O (n) 연산입니다. 왜냐하면 모든 것을 복사해야하기 때문입니다. 실제로 연결된 목록을 원했습니까? –

+0

글쎄, 나는 거의없고 계속 요소가있다.적어도 해시 테이블은 어리 석을 것이라고 생각합니다. 내가 알아낼 수없는 겉보기에 사소한 최적화 외에도 연결된 목록에 어떤 문제도 보이지 않습니다. – Steinbitglis