2010-02-24 8 views
3

현재 foreach를 사용 중이며 항목의 인덱스가 필요합니다.Foreach의 인덱스

  foreach (DataRow m_row in base_rows) 
     { 
      Company nu = new Company(m_row, symb_rows[0]); 
     } 

다음은 코드입니다.

나는 m_row의 인덱스를 base_rows 안에 넣고이를 사용하여 symb_rows[index_of_m_row]을 전달하려고합니다. 이것이 가능합니까 아니면 그냥 일반 for 루프를 사용해야합니까?

Int32 i = 0; 
foreach (DataRow m_row in base_rows) 
{ 
    Company nu = new Company(m_row, symb_rows[i]); 
    i++; 
} 

또는 표준 for 루프를 사용 : 컬렉션의 현재 인덱스를 알고하기 위해

답변

11

"for"루프 솔루션은 완전히 분명합니다. 흥미로운 대체 솔루션으로, 당신은 모두 루프를 피하다 수 :

var companies = baseRows 
    .Select((row, index) => new Company(row, symbRows[index])) 
    .ToList(); 
+1

+1 매우 영리합니다. –

+4

@Andrew : 따라서 나쁜 아이디어 일 수 있습니다. 나는 영리한 코드를 싫어한다. 나는 평범하고 지루하고 읽기 쉽고 이해하기 쉬운 코드가 좋으며 영리하지 않아도됩니다. 이 기법은 연산의 의미가 변환보다 쿼리와 유사하다는 컨텍스트에서 유용 할 수 있습니다. 나는이 특별한 경우에 과잉이라고 생각하고 for 회 돌이가 더 나은 해결책이라고 생각한다. 실제로 이것은 엔터테인먼트 용도로만 사용됩니다. –

+0

나는 이해하고 완전히 동의한다. 나는 엔터테인먼트를 바르게 평가했다! :) –

7

당신은이 작업을 수행해야합니다 (A foreach 사용). IEnumerable 인터페이스는 항목의 기본 시퀀스에 대해 전진 전용 반복자이기 때문에 위치 인덱스 속성을 노출하지 않습니다.

+1

네, 그냥 for 루프를 사용하고, GetLowerBound, GetUpperBound를 사용하고 루프 할 때 각 루프가 유효한 지 확인하십시오. – MindStalker

1

Andrew Hare가 제안한 것처럼 일반적인 for-loop를 사용하거나 자신 만의 카운터를 만들어야합니다. 나는 for-loop를 사용할 것을 제안 할 것이다.

1

인덱스가 필요한 경우 일반 for 루프를 사용하는 것이 좋습니다.

0

정상적인 루프 만 사용합니다.

반복 할 때마다 int가 증가 할 수 있지만 보통 for(int i = 0....이 최선의 방법입니다.

+0

주제를 조금 벗어나지 만 일부 콜렉션의 경우 정수로 색인화 할 수 없습니다.사전은 이와 같이 색인을 생성 할 수 없으며 링크 된 목록은 잘못 수행 될 수 있습니다. 필자는 iterator와 manulum 정수 인덱스를 사용하고 나중에 성능 문제를 남겨 둘 것이다. – Skizz

1

절대 가장 좋은 방법은 대신에() {} 루프를 사용하는 것이 물론이다 해결하기 위해. 하지만 당신은 펑키 얻을 및 확장 - 방법 :

public static void ForEachWithIndex<T>(this IEnumerable<T> items, Action<T, int> render) 
{ 
    if (items == null) 
     return; 
    int i = 0; 
    items.ForEach(item => render(item, i++)); 
} 

를 작성하고도, 어쩌면에 대한 루프 작업 나아 다시 다음

base_rows.ForEachWithIndex((m_row, index) => { 
    Company nu = new Company(m_row, symb_rows[index]); 
}); 

그러나 그것을 사용할 수 있습니다)

0

, t

foreach(DataRow m_row in base_rows) 
    Company nu = new Company(m_row, symb_rows.IndexOf(m_row)); 

아마도 대신) 사항 Array.indexOf를 (사용해야 할 것입니다 : 나는 아마 그래서 같이 같이 IndexOf() 메소드를 사용하는 것이 좋습니다 것 VBNET2008에서 일했던 저는 현재이 작업을하고 있지만 C#에서는 테스트하지 않았습니다.

For Each DataRow m_row in base_rows 
    Company nu = New Company(m_row, symb_rows(Array.IndexOf(symb_rows, m_row))) 
Next 

그래서 C#에서 다음을 제안 할 수 있습니다.

foreach (DataRow m_row in base_rows) 
    Company nu = new Company(m_row, symb_rows[Array.IndexOf(symb_rows, m_row)]); 

그렇지 않으면 for (;;)를 사용하는 것을 고려해 볼 수 있습니다.

for(int index = 0; index < base_rows.Length && index < symb_rows.Length; ++index) 
    Company nu = new Company(base_rows[index], symb_rows[symb_rows.IndexOf(base[index])]); 

나는 당신이 어느 쪽을 선호하는지 모르겠다.

+0

IndexOF()를 사용하면 루프 O (n^2)를 만들 수 있습니다. IndexOf (내 생각에) 목록의 각 요소를 검사하여 색인을 찾습니다. –

+0

@Dean J : 나는 더 동의 할 수 없었다. 따라서 foreach() 루프 내에서 인덱스를 얻는 것이 목적입니다. 사실, 나는 에릭 리 퍼트의 영리한 솔루션을 선호합니다. =) 코멘트 주셔서 감사합니다! –

관련 문제