6 Stimmen

Gibt es eine Möglichkeit, den Indexwert in einer LINQ Where-Methode in C# zu erfassen?

Meine folgenden C#-Code ist offensichtlich ein Hack, so wie ich den Indexwert in der Methode Where 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

4voto

Jon Skeet Punkte 1325502

El Where Methode nur gibt zurück, ob das Element in das Ergebnis aufgenommen werden soll oder nicht. Die Funktion kann keine weiteren Informationen auf sinnvolle Weise liefern (sie könnte eine lokale Variable erfassen und damit etwas anstellen, aber das wäre schrecklich).

Wenn Sie den Index im Endergebnis haben wollen, müssen Sie eine Projektion erstellen, die diesen Index enthält. Wenn Sie den Original Index im Endergebnis haben, müssen Sie diese Projektion vor jede Where Klauseln.

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 }

3voto

tofi9 Punkte 5595

Welchen Index wünschen Sie? Sie haben dreimal b. Wenn Sie alle Indizes von b wollen, dann:

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

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

0voto

mqp Punkte 66863

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

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X