2009-04-29 4 views
6

다음 C# 코드는 분명히 해킹이므로 Where 메서드에서 인덱스 값을 캡처하는 방법은 무엇입니까?LINQ Where 위치에서 C# 인덱스 값을 캡처하는 방법이 있습니까?

 string[] IntArray = { "a", "b", "c", "b", "b"}; 
        int index=0; 
        var query = IntArray.Where((s,i) => (s=="b")&((index=i)==i)); 

    //"&" and "==i" only exists to return a bool after the assignment ofindex 

    foreach (string s in query) 
       { 
        Console.WriteLine("{0} is the original index of {1}", index, s); 
       } 
//outputs... 
//1 is the original index of b 
//3 is the original index of b 
//4 is the original index of b 

답변

4

Where 방법 반환 : 당신이 다음에 b의 모든 인덱스를합니다. 이 함수는 현명한 방법으로 더 이상 정보를 제공 할 수 없습니다. 은 로컬 변수를 캡처하여 처리하지만 끔찍할 수 있습니다.

최종 결과에 색인을 표시하려면 해당 색인이 포함 된 투영법을 만들어야합니다. 원래 색인을 최종 결과로 사용하려면 Where 절 앞에 먼저 해당 투영법을 넣어야합니다.

다음은 그 예입니다 :

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Test 
{ 
    static void Main() 
    { 
     IEnumerable<char> letters = "aBCdEFghIJklMNopQRsTUvWyXZ"; 

     var query = letters.Select((c, i) => 
            new { Char=c, OriginalIndex=i }) 
          .Where(x => char.IsLower(x.Char)) 
          .Select((x, i) => 
            new { x.Char, 
             x.OriginalIndex, 
             FinalIndex=i}); 

     foreach (var result in query) 
     { 
      Console.WriteLine(result); 
     } 
    } 
} 

결과 :

{ Char = a, OriginalIndex = 0, FinalIndex = 0 } 
{ Char = d, OriginalIndex = 3, FinalIndex = 1 } 
{ Char = g, OriginalIndex = 6, FinalIndex = 2 } 
{ Char = h, OriginalIndex = 7, FinalIndex = 3 } 
{ Char = k, OriginalIndex = 10, FinalIndex = 4 } 
{ Char = l, OriginalIndex = 11, FinalIndex = 5 } 
{ Char = o, OriginalIndex = 14, FinalIndex = 6 } 
{ Char = p, OriginalIndex = 15, FinalIndex = 7 } 
{ Char = s, OriginalIndex = 18, FinalIndex = 8 } 
{ Char = v, OriginalIndex = 21, FinalIndex = 9 } 
{ Char = y, OriginalIndex = 23, FinalIndex = 10 } 
+0

감사합니다. Jon, 일을 정리했습니다. 나는 Where 메서드로 무언가를 놓치지 않았는지, 아니면 let 또는 into와 함께 할 다른 무언가를 놓치지 않았는지 확인했다. 좀 더 읽을 필요가있어. –

3

어떤 색인을 원하십니까? 너는 세 번이나. 항목이 결과에 여부를 포함해야하는지 여부를

 string[] IntArray = { "a", "b", "c", "b", "b" }; 

     var query = IntArray 
        .Select((x, i) => new { value = x, idx = i }) 
        .Where(s => s.value == "b"); 
+0

고마워, 그건 의도 였어. –

0

현재 코드는 변수 index에서 "B"의 마지막 인덱스를 캡처합니다. LINQ를 사용하여 기능을 복제하려면, 사용

int index = IntArray.LastOrDefault(s => s == "b"); 

나는 이것이 당신이 실제로 원하는 것입니다 여부를 알 수 없습니다.

+0

질문의 코드가 작동합니다. 투영 될 때 마지막 문자뿐만 아니라 문자 b의 각 항목의 색인 값을 제공합니다. –

관련 문제