475 Stimmen

Wie lautet der Index mit LINQ abrufen?

Angenommen, Sie haben eine Datenquelle wie diese:

var c = new Car[]
{
  new Car{ Color="Blau", Price=28000},
  new Car{ Color="Rot", Price=54000},
  new Car{ Color="Pink", Price=9999},
  // ..
};

Wie kann ich den Index des ersten Autos finden, das eine bestimmte Bedingung mit LINQ erfüllt?

BEARBEITEN:

Ich habe an etwas wie das gedacht, aber es sieht schrecklich aus:

int firstItem = someItems.Select((item, index) => new    
{    
    ItemName = item.Color,    
    Position = index    
}).Where(i => i.ItemName == "Lila")    
  .First()    
  .Position;

Wäre es am besten, dies mit einer einfachen Schleife zu lösen?

0 Stimmen

0 Stimmen

Auch diese Informationen wären hilfreich - stackoverflow.com/questions/4049773/…

11 Stimmen

Eigentlich gibt es eine index Anweisung: var result = items.Select((item, index) => new { index, item });

6voto

jwize Punkte 4103

Hier ist eine kleine Erweiterung, die ich gerade zusammengestellt habe.

public static class PositionsExtension
{
    public static Int32 Position(this IEnumerable source,
                                          Func predicate)
    {
        return Positions(source, predicate).FirstOrDefault();
    }
    public static IEnumerable Positions(this IEnumerable source, 
                                                        Func predicate)
    {
        if (typeof(TSource) is IDictionary)
        {
            throw new Exception("Wörterbücher werden nicht unterstützt");
        }

        if (source == null)
        {
            throw new ArgumentOutOfRangeException("Quelle ist null");
        }
        if (predicate == null)
        {
            throw new ArgumentOutOfRangeException("Prädikat ist null");
        }
        var found = source.Where(predicate).First();
        var query = source.Select((item, index) => new
            {
                Found = ReferenceEquals(item, found),
                Index = index

            }).Where( it => it.Found).Select( it => it.Index);
        return query;
    }
}

Dann können Sie es wie folgt aufrufen.

IEnumerable Indizes, an denen die Bedingung erfüllt ist = 
      ListItems.Positions(item => item == this);

Int32 ersteWillkommensnachricht ListItems.Position(msg =>               
      msg.WelcomeMessage.Contains("Hallo"));

4voto

Sam Punkte 37787

Hier ist eine Implementierung der am höchsten bewerteten Antwort, die -1 zurückgibt, wenn das Element nicht gefunden wird:

public static int FindIndex(this IEnumerable items, Func predicate)
{
    var itemsWithIndices = items.Select((item, index) => new { Item = item, Index = index });
    var matchingIndices =
        from itemWithIndex in itemsWithIndices
        where predicate(itemWithIndex.Item)
        select (int?)itemWithIndex.Index;

    return matchingIndices.FirstOrDefault() ?? -1;
}

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