33 Stimmen

Wie man Array-Index nach Where-Klausel mit Linq auswählen?

Angenommen, ich habe das Array string[] weekDays = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" }; und ich möchte den Index der Array-Elemente herausfinden, die 's' enthalten. Wie kann ich dies mit Linq tun?

Ich habe versucht int[] indexOfDaysContainingS = weekDays.Where(day => day.Contains("s")).Select((day, index) => index).ToArray(); aber dies ergibt 0,1,2 da es vermutlich den Index der gefilterten IEnumberable<string> stattdessen nach der Where()-Klausel. Wenn ich die Select()-Klausel zuerst einfüge, dann habe ich nur den Index und kann nicht nach den Tagen filtern.

Was muss ich ändern, damit es funktioniert und ich zurückkehren kann? 1,2,3 stattdessen?

44voto

Patko Punkte 4275

Sie könnten es so machen:

weekDays.Select((day, index) => new { Day = day, Index = index })
        .Where(x => x.Day.Contains("s"))
        .Select(x => x.Index)
        .ToArray();

Ich bin nicht sicher, ob das optimal ist

15voto

Ani Punkte 107342

Die Antwort von Patko ist der richtige Weg für den allgemeinen Fall.

Hier sind 2 weitere Optionen:

// Idea only works with collections that can be accessed quickly by index.
int[] indices = Enumerable.Range(0, weekDays.Length)
                          .Where(index => weekDays[index].Contains("s"))
                          .ToArray();

Mit MehrLinq :

// Similar to Patko's idea, except using a 'named' type.
int[] indices = weekDays.AsSmartEnumerable()
                        .Where(item => item.Value.Contains("s"))
                        .Select(item => item.Index)
                        .ToArray();

-3voto

Ashraf Punkte 1

Das sollte funktionieren:

weekDays.Where(a => a.Contains("s")).Select((a, i) => i).ToArray();

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