2012-09-19 4 views
1

같은 열거 형에서 실행중인 메서드 내에서 열거 형 소스를 참조 할 수 있습니까?해당 열거 형의 메서드 내에서 소스 열거 형을 참조할까요?

IEnumerable<int> result = Enumerable.Range(1, 6) 
    .Where(a => Enumerable.Range(1, 6).Count() % 2 == 0); 

내가 원래 열거를 반복 그것을 생산하는 청소기 방법이 있는지 알고 싶어, 같은 :

예를 들어,이 코드는 1-6의 원래 열거 범위를 반복

IEnumerable<int> result = Enumerable.Range(1, 6) 
    .Where(a => [source reference].Count() % 2 == 0); 

예, 저는 다음 해결책이 있다는 것을 알고 있습니다 ...하지만 위에서 설명한 바와 같이 메모리 내 열거 형에 대한 직접적인 참조를 수행 할 수있는 방법이 있습니까?

IEnumerable<int> source = Enumerable.Range(1, 6); 
IEnumerable<int> result = source.Where(a => source.Count() % 2 == 0); 

위의 코드 줄에 대한 구체적인 대답은 찾고 있지 않습니다. 그들은 단지 내가 알고 싶은 것을 보여주는 모범이다.

+5

나는 C#이 당신의 마지막 예제가 아닌 해결책이 있다고 생각하지 않는다. 나는이 마지막 예를 매우 이해할 수 있다고 생각한다. – zmbq

+0

열거 형을 직접 참조하지 않을 때 열거 형을 직접 참조 할 방법을 원하십니까? – asawyer

+3

왜 모든 항목에 대해 동일한 결과를 줄 수있는'Where' 쿼리 내에서 조건을 사용하고 있습니까? – Rawling

답변

2

내장 된 IEnumerable 확장 방법 중 원하는 것을 아무 것도 할 수 없습니다. 그들은 모두 개별 아이템에서만 작동하는 lamba 표현식을 허용하므로 표현식에 부모 컨테이너에 대한 액세스 권한이 없습니다.

아무것도 자신의 압연에서 당신을 중지하지 않습니다하지만, 뭔가 같은 : 개인적으로

public static IEnumerable<T> WhereSource<T> (this IEnumerable<T> source, Func<IEnumerable<T>, T, bool> predicate) 
{ 
    foreach (var item in source) 
    { 
    if (predicate(source, item)) 
    { 
     yield return item;  
    } 
    } 
} 

, 나는 원래 솔루션은 사용자 정의 확장 메서드 공예에 비해 훨씬 명확 더 유지 보수, 그리고 더 나은 생각하지만 확실히 가능합니다.

+0

그러면 호출 사이트는'IEnumerable result = Enumerable.Range (1, 6) .WhereSource ((source, item) => source)와 같이 보일 것입니다.Count() % 2 == 0);'꽤 쓸모없는 예제입니다. 항상 '사실입니다.' – asawyer

+0

모든 진술은 OP가 "코드 라인에 대한 구체적인 대답을 찾고있는 것이 아닙니다. 그들은 단지 내가 알고 싶은 것을 보여주는 모범적 인 사례 "라고 말했다. –

0

아니요. Enumerable.Range(1, 6))에는 이름이 없기 때문에 그럴 수 없습니다.

어떻게 이름이없는 엔티티를 호출할까요?

참조 할 이름이 없기 때문에 세 번째 코드 단편을 사용할 수 있습니다.

이를 의미했다 당신이

int length = 6; // Here hard-coded but can be passed from a parameter. 
IEnumerable<int> source = Enumerable.Range(1, Length); 
IEnumerable<int> result = source.Where(a => length % 2 == 0); 
1

을 할 수 그러나?

IEnumerable<int> source = Enumerable.Range(1, 6); //{1,2,3,4,5,6} 
IEnumerable<int> result = source.Where((a, i) => i % 2 == 0); //{1,3,5} 
IEnumerable<int> result2 = source.Where(a => a % 2 == 0); //{2,4,6} 
+0

그는 색인의 컬렉션이 아닌 길이의 모드를 취하고있다. –

+3

@NikhilAgrawal 나는 그것을 본다 ... 그러나 어떤 의미가있다 ... 그는 단지'6 % 2'을 할 수있다. 왜 열거를 하는가 ?? – horgh

+1

해당 값이 매개 변수로 전달 될 수 있습니다. –