2014-12-10 7 views
1

채널 목록이 있고 일부 채널에 할당되지 않은 장치가 있으며이 장치는 별도의 컨테이너로 전달됩니다. 내가하고 싶은 것은 ForEach 호출 내 목록의 현재 위치 인덱스를 컨테이너에 전달하는 것입니다. 나는 linq을 사용하여 이와 같은 작업을 수행 할 수 있습니까, 아니면 대신 for..loop을 사용하는 것이 더 좋을까요?ForEach 내의 현재 색인 얻기

가능 :) 경우 LINQ를 사용 싶어요 어쨌든 여기 내 코드입니다 : 반드시 인덱스가없는 ForEach 'D가되고있는

item.Channels.Where(ch => !ch.IsSkipped).ForEach(
        ch => 
         { 
          if (ch.AssignedUnit == null) 
          { 
           //unknownUnitChannels.Add(ch); 
           unknownUnitChannels.Add(index, ch) <== This is the index i'd like to pass there 
          } 
         }); 
+4

어떤 ForEach 메소드가 무엇입니까? 'IEnumerable '에 정상적으로 존재하지 않습니다 ... 또한, * 필터링 *이나 * after * 필터링 이전의 인덱스 *에 관심이 있으십니까? 예를 들어,'Where' 절로 인해 처음 10 개의 항목이 걸러지면'index'가 0 또는 10으로 기대됩니까? –

+2

또는 약간의 노력을 할애하고 알 수없는 UnUnitChannels.AddRange (item.Channels.Where (ch =>! ch.IsSkipped && ch.AssignedUnit == null)) – Rytmis

+0

가능한 경우 필터링하기 전에. ForEach는 프로젝트에서 사용되는 사용자 지정 확장입니다. 나는 C# foreach를 사용할지도 모른다 – Nostradamus

답변

4

: 당신이 필터링하기 전에 색인을 원하는 경우

int index = 0; 
foreach(var ch in item.Channels.Where(x => x.IsSkipped)) 
{  
    if (ch.AssignedUnit == null) { 
     unknownUnitChannels.Add(index, ch); 
    } 
    index++; 
} 

는 이렇게 원래 색인 (Where이 적용되기 전에), 다음과 같은 것이 필요합니다.

item.Channels.Select((c, i) => new { Channel = c, Index = i }) 
      .Where(x => !x.Channel.IsSkipped) 
      .ForEach(x => 
      /* x.Channel is your item, x.Index is its original Index */ 
      ); 
+1

좋아 보인다. 나는 Select ((c, i) => new {Channel = c, Index = i})를 할 수있는 것을 좋아한다. Where – Nostradamus

+1

매력처럼 작동한다. – Nostradamus

3

아무것도. 모든 IEnumerable이 인덱스별로 저장되는 것은 아닙니다. 당신이 인덱스를 가지고 싶다면

, 당신은 같은 것을 할 수 있습니다 : 당신이 사용하려는 경우

int index = 0; 
foreach(var ch in item.Channels) 
{  
    if (ch.AssignedUnit == null && !x.IsSkipped) { 
     unknownUnitChannels.Add(index, ch); 
    } 
    index++; 
} 
+0

이것은 필터링하기 전에 색인을 사용하지 않지만 그럼에도 불구하고 좋은 대답이다. –

+1

필터링하기 전에 색인을 사용하여 편집하는 방법을 참조하십시오. – DLeh