2010-02-16 4 views
0

foreach 루프를 사용하지 않고 목록에서 요소를 검색하려면 어떻게해야합니까?C#에서 foreach 루프를 사용하지 않고 목록의 요소를 검색하는 방법은 무엇입니까?

+5

. 귀하의 질문에 더 잘 답변하는 데 도움이되는 세부 정보가있을 수 있습니다. –

+0

당신은 무엇을하려고합니까? 왜 foreach를 사용할 수 없습니까? 리스트 인덱서는 어떻습니까? –

+0

iterator를 사용하여 검색하고 싶습니다. – ratty

답변

6
var list = new List<int> { 1, 2, 3, 4, 5 }; 
for (int i = 0; i < list.Count(); i++) 
{ 
    var element = list[i]; 
} 

또는

var list = new List<int> { 1, 2, 3, 4, 5 }; 
using (var enumerator = list.GetEnumerator()) 
{ 
    while (enumerator.MoveNext()) 
    { 
     var element = enumerator.Current; 
    } 
} 
+3

열거자를 처리하는 것을 잊지 마십시오. –

+0

감사합니다 - 업데이트 됨 –

1

당신은 목록 말하지만, 당신은 또한 this answer assumes (과 List<T> 클래스를 지정하지 않으면, 그 대답은 당신입니다. 백작() 확장 메서드를 사용하는 추가 될 수 형식이 List<T> 인 것을 알고 계신다면 속성 인을 사용하는 것이 더 좋습니다.

IList<T> 인터페이스 구현을 항상 사용하는 경우 인덱스를 반복하고 그 값으로 인덱서에 액세스하는 for 루프를 사용하면 정상적으로 작동합니다.

그러나 IEnumerable<T> 구현을 다루는 경우에는 항상 작동하지 않습니다. 대신 다음을 수행해야합니다.

컴파일러가 컴파일 될 때 foreach 문을 확장하는 방법입니다. 기본적으로 IEnumerable<T> 구현은 IDisposable을 구현할 수 있기 때문에 IDisposable로 캐스팅하려고 시도하여 그 결과를 준비합니다. 그렇지 않으면 using 문은 종료시 아무 것도하지 않습니다.

배열에서 foreach를 사용할 때 컴파일러는 위의 열거 형 접근법이 아닌 인덱스별로 항목에 액세스하는 루프로 확장됩니다 (직접 배열 인스턴스로 작업하는 경우). 당신이 이런 유형의 루프 방지하려는 경우

1

:

foreach(var item in list) {}; 

을 ... 당신은 검색 목록에서 검색 할 Linq에 또는 람다 표현식을 사용할 수 있습니다. 예를 들어

:

using System.Linq; 

    // ... with Lambda 
    var ints = new List<int>(){1,2,3,4,5}; 
    var evenInts = ints.ForEach(i => i % 2 == 0); 

    // with straight Linq-to-objects: 
    var oddInts = from i in ints 
     where i % 2 == 1 
     select i; 
난 당신이 foreach 문을 사용하지 않는 이유를 알고 싶습니다
관련 문제