.NET 컬렉션 라이브러리의 목록이 있으며 단일 요소를 제거하려고합니다. 슬프게도 다른 개체와 직접 비교하여 찾을 수 없습니다.술어로 목록에서 요소 제거
FindIndex
과 RemoveAt
을 사용하면 목록이 여러 번 통과하게됩니다.
열거자를 사용하여 요소를 제거하는 방법을 모르겠습니다. 그렇지 않으면 작동하지 않을 수 있습니다.
RemoveAll
내가 필요한 것은 하나의 요소가 발견되면 멈추지 않을 것입니다.
아이디어가 있으십니까?
.NET 컬렉션 라이브러리의 목록이 있으며 단일 요소를 제거하려고합니다. 슬프게도 다른 개체와 직접 비교하여 찾을 수 없습니다.술어로 목록에서 요소 제거
FindIndex
과 RemoveAt
을 사용하면 목록이 여러 번 통과하게됩니다.
열거자를 사용하여 요소를 제거하는 방법을 모르겠습니다. 그렇지 않으면 작동하지 않을 수 있습니다.
RemoveAll
내가 필요한 것은 하나의 요소가 발견되면 멈추지 않을 것입니다.
아이디어가 있으십니까?
편집 : 이제 영업 이익은 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;
}
}
하나의 요소 만 제거하려고합니다. – Steinbitglis
@Steinbitglis : 술어와 일치하는 값이 여러 개 있습니까? 어떤 종류의 목록을 사용하고 있습니까? –
@Steinbitglis : 부작용을 사용하여'RemoveAll'을 사용하는 방법을 보여주기 위해 편집되었습니다. –
(x => x = 10)
분명히 개체를 일치에 대한 조건입니다
List<int> list = new List<int>();
list.Remove(list.FirstOrDefault(x => x = 10));
: 그 술어 다음 (예)를 사용할 수 있습니다 일치합니다.
이렇게하려면 목록을 두 번 열거해야합니다. 한 번 일치하는 항목을 찾습니다. 이 항목을 '제거'에서 다시 한 번 찾으십시오. –
사실, RemoveAt를 사용하는 것이 더 효율적입니다. – Strillo
List<T>
는
int index = words.FindIndex(s => s.StartsWith("x"));
words.RemoveAt(index);
은 "X"로 시작하는 단어를 삭제 제 술어 FindIndex
받는 방법이있다. words
은이 예제에서 List<string>
으로 가정합니다.
리스트에 상수 시간 인덱스 조회가있는 경우 이것이 괜찮을 것이라고 생각합니다. RemoveAt가 목록을 통과 할까봐 걱정했습니다. – Steinbitglis
@Steinbitglis : O (n) 연산입니다. 왜냐하면 모든 것을 복사해야하기 때문입니다. 실제로 연결된 목록을 원했습니까? –
글쎄, 나는 거의없고 계속 요소가있다.적어도 해시 테이블은 어리 석을 것이라고 생각합니다. 내가 알아낼 수없는 겉보기에 사소한 최적화 외에도 연결된 목록에 어떤 문제도 보이지 않습니다. – Steinbitglis
몇 가지 예제 코드를 보여 주시겠습니까? –
질문은'linked-list'로 태그가 붙었지만 그 설명은'List'을 제안합니다. 무엇 이니? –
Ani
귀하의 목록은 어떤 유형입니까? – Strillo