2009-04-29 103 views
6

我的下面的C#代碼顯然是一個黑客,所以如何捕獲Where方法中的索引值?有沒有辦法在C#中的LINQ Where方法中捕獲索引值?

 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方法返回該項目是否應該被包括在結果還是不行。該功能無法以合理的方式提供更多信息(它可以捕獲局部變量並對其進行處理,但這太可怕了)。

如果您想要最終結果中的索引,您需要創建一個包含該索引的投影。如果您想在最終結果中使用原始索引,則需要將該投影放在任何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方法的某些東西,或者可能還有其他的東西需要放入或放入。我需要閱讀更多。 – 2009-04-29 20:46:04

3

你想要哪個索引?你有三次b。如果你想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

謝謝,這是意圖。 – 2009-04-29 21:05:35

0

您當前的代碼捕獲 「B」 中的變量index的最後一個索引。要使用LINQ複製您的功能,請使用:

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

我不知道這是否是您實際需要的。

+0

問題中的代碼確實有效。投影時,它給出字母b的每次出現的指數值,而不僅僅是最後一次。 – 2009-04-29 20:54:14

相關問題