2 Stimmen

Bessere Möglichkeit, Listen zu durchsuchen als mit foreach

list vclAsset<FullAsset>
list callsigns<string>

foreach(FullAsset fa in vclAsset)
{
    if (callsigns.contains(fa.asset.callsign))
    {
         //do something
    }

}

Gibt es einen eleganteren Weg, um das oben genannte zu tun? Ein FullAsset-Objekt enthält ein Asset-Objekt, das wiederum eine Zeichenkette "Callsign" enthält. Jedes Rufzeichen ist eindeutig, so dass meine Liste Rufzeichen nur ein Exemplar jeder Zeichenfolge enthält und keine zwei FullAsset-Objekte eine Asset.callsign-Variable gemeinsam nutzen.

Kurz gesagt möchte ich alle FullAssets ziehen, die ein bestimmtes Rufzeichen haben, aber mit einem foreach scheint ungeschickt (angesichts der Tatsache, dass die Anzahl der FullAssets, die in der genannten Liste enthalten sein könnte potenziell keine Obergrenze hat).

3voto

Groo Punkte 47623

Wenn Ihre Schlüssel eindeutig sind, können Sie eine Wörterbuch oder eine Hashtabelle um die Suche zu beschleunigen.

Wenn Sie nur finden. ein bestimmtes Element, können Sie mit der List<T>.Find Methode und liefern ein Prädikat.

FullAsset result = vclAsset.Find
     (fa => callsigns.contains(fa.asset.callsign));

o

List<FullAsset> results = vclAsset.FindAll
     (fa => callsigns.contains(fa.asset.callsign));

Wenn Sie .Net 3.5 verwenden, ist LINQ Wo kann eine bessere Lösung sein, wie andere festgestellt haben, da es einen Enumerator (lazy Auswertung) vs eine vollständige Liste zurückgibt.

3voto

AdaTheDev Punkte 135097

Sie könnten einen Lambda-Ausdruck verwenden, etwa so:

foreach(FullAsset fa in vclAsset.Where(a => callsigns.contains(a.asset.callsign))
{
    // do something
}

2voto

Henrik Gering Punkte 1617

Sicher, mit linq.

var assets=    vclAsset.Where(fullA=>allsigns.contains(fullA.asset.callsign));

Vermögenswerten wird eine aufzählbare Struktur sein.

Ich kann empfehlen 100 Linq-Proben zur Inspiration und zum Lernen

0voto

IanR Punkte 4513

Ich bin nicht sicher, ob es als eleganter gilt, aber Sie können linq...

        var results = from fa in vclAsset
                      where callsigns.Contains(fa.asset.callsign)
                      select fa;

0voto

Arnis Lapsa Punkte 42566
var result = vclAsset.Where(x=>callsigns.Any(y=>x.asset.callsign==y));

P.s. Ich würde umbenennen in vclAsset y asset / callsign Eigenschaften.

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