2009-04-29 8 views
6

Mein folgender C# -Code ist offensichtlich ein Hack. Wie erfasse ich den Indexwert in der Where-Methode?Gibt es eine Möglichkeit, den Indexwert in einer LINQ Where-Methode in C# zu erfassen?

 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 

Antwort

4

Die Where Methode nur zurückkehrt, ob der Artikel sollte im Ergebnis oder nicht einbezogen werden. Die Funktion kann keine sinnvollen Informationen mehr liefern (sie könnte könnte eine lokale Variable erfassen und Sachen damit machen, aber das wäre schrecklich).

Wenn Sie den Index im Endergebnis haben möchten, müssen Sie eine Projektion erstellen, die diesen Index enthält. Wenn Sie den ursprünglichen Index im Endergebnis wollen, müssen Sie diese Projektion vor irgendwelchen Where Klauseln setzen.

Hier ist ein Beispiel dafür:

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); 
     } 
    } 
} 

Ergebnisse:

{ 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

Danke Jon, das hat alles aufgeklärt. Ich habe nur dafür gesorgt, dass ich etwas nicht mit der Where-Methode oder etwas anderem, was mit Let oder In tun hat, verpasst habe. Ich muss noch etwas lesen. –

3

Welchen Index möchten Sie? Du hast dreimal b. Wenn Sie alle Indizes b, dann gilt:

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

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

Danke, das war die Absicht. –

0

Ihr aktueller Code den letzten Index von "b" in den Variablen index einfängt. Um Ihre Funktionalität mit LINQ zu replizieren, verwenden Sie:

Ich weiß nicht, ob das ist, was Sie eigentlich wollen.

+0

Der Code in der Frage funktioniert. Wenn es projiziert wird, gibt es den Indexwert jedes Auftretens des Buchstabens b nicht nur des letzten. –

Verwandte Themen