2009-04-29 7 views
6

私の次のC#コードは明らかにハックですので、Whereメソッドでインデックス値を取得するにはどうすればいいですか?LINQのインデックス値をキャプチャする方法はありますか?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

ありがとうございました。私はWhereメソッドで何かを逃していないことを確認していました。私はもう少し読む必要があります。 –

3

どのインデックスを使用しますか?あなたは3回bを持っています。項目が結果にか含まれるべきかどうかを

 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" の最後のインデックスを取得します。

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

LINQを使用して機能を複製するには、次のように指定します。

+0

質問のコードがうまくいきます。投影されると、最後のものだけでなく、文字bの各出現のインデックス値が与えられます。 –

関連する問題