Hier habe ich ein einfaches Beispiel, um ein Element in einer Liste von Zeichenfolgen zu finden. Normalerweise verwende ich for loop oder einen anonymen Delegaten, um dies folgendermaßen zu tun:
int GetItemIndex(string search)
{
int found = -1;
if ( _list != null )
{
foreach (string item in _list) // _list is an instance of List<string>
{
found++;
if ( string.Equals(search, item) )
{
break;
}
}
/* use anonymous delegate
string foundItem = _list.Find( delegate(string item) {
found++;
return string.Equals(search, item);
});
*/
}
return found;
}
LINQ ist neu für mich. Ich bin gespannt, ob ich mit LINQ einen Artikel in der Liste finden kann. Wie wenn möglich?
Antworten:
Es gibt einige Möglichkeiten (beachten Sie, dass dies keine vollständige Liste ist).
1) Single gibt ein einzelnes Ergebnis zurück, löst jedoch eine Ausnahme aus, wenn keine oder mehrere gefunden werden (die möglicherweise das sind, was Sie möchten oder nicht):
Hinweis
SingleOrDefault()
verhält sich gleich, außer dass für Referenztypen null oder für Werttypen der Standardwert zurückgegeben wird, anstatt eine Ausnahme auszulösen.2) Wo werden alle Elemente zurückgegeben, die Ihren Kriterien entsprechen, sodass Sie möglicherweise eine IEnumerable mit einem Element erhalten:
3) Zuerst wird der erste Artikel zurückgegeben, der Ihren Kriterien entspricht:
Hinweis
FirstOrDefault()
verhält sich gleich, außer dass für Referenztypen null oder für Werttypen der Standardwert zurückgegeben wird, anstatt eine Ausnahme auszulösen.quelle
ReadOnlyCollection
oder verwendet werdenObservableCollection
?IEnumerable<T>
oderIQueryable<T>
Wenn Sie den Index des Elements möchten, tun Sie dies:
Sie können das Lambda nicht im ersten Durchgang loswerden.
Beachten Sie, dass dies ausgelöst wird, wenn der Gegenstand nicht existiert. Dies löst das Problem, indem auf nullbare Ints zurückgegriffen wird:
Wenn Sie den Artikel möchten:
Wenn Sie die Anzahl der übereinstimmenden Elemente zählen möchten:
Wenn Sie alle Elemente möchten, die übereinstimmen:
Und vergessen Sie
null
in keinem dieser Fälle , die Liste zu überprüfen .Oder verwenden Sie
(list ?? Enumerable.Empty<string>())
anstelle vonlist
.Vielen Dank an Pavel für die Hilfe in den Kommentaren.
quelle
string.Equals
- nichts Falsches daran==
. Zweitens würde ich auch erwähnenFirstOrDefault
(für Fälle, in denen ein Artikel möglicherweise nicht vorhanden ist) undSelect
mit einem Index, um den Fall abzudecken, in dem ein Index des Artikels benötigt wird (wie im Beispiel in der Frage selbst).ArgumentNullException
wenn die Quelle null istWenn es wirklich ein
List<string>
LINQ ist, verwenden Sie einfach:Wenn Sie nach dem Artikel selbst suchen, versuchen Sie:
quelle
_list.Find(search)
für das zweite verwenden.Möchten Sie das Element in der Liste oder das tatsächliche Element selbst (würde das Element selbst annehmen).
Hier sind eine Reihe von Optionen für Sie:
quelle
Diese Methode ist einfacher und sicherer
bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false
quelle
true : false
unten sollte gleich funktionierenbool insertOrderNew = lOrders.Find(r => r == "1234") == null;
Wie wäre es
IndexOf
?Beispielsweise
Beachten Sie, dass -1 zurückgegeben wird, wenn der Wert nicht in der Liste vorkommt
quelle
Früher habe ich ein Wörterbuch verwendet, eine Art indizierte Liste, die mir genau das gibt, was ich will, wenn ich es will.
Wenn ich beispielsweise auf meine Randwerte zugreifen möchte, adressiere ich mein Wörterbuch:
Je nachdem, was Sie tun, kann ein Wörterbuch hilfreich sein.
quelle
Hier ist eine Möglichkeit, Ihre Methode für die Verwendung von LINQ neu zu schreiben:
Also nenne es mit
GetItemIndex("two")
wird zurückkehren1
,und
GetItemIndex("notthere")
wird zurückkehren-1
.Referenz: linqsamples.com
quelle
Versuchen Sie diesen Code:
quelle
Wenn wir ein Element aus der Liste suchen müssen, können wir die Methode
Find
undFindAll
extensions verwenden, aber es gibt einen kleinen Unterschied zwischen ihnen. Hier ist ein Beispiel.quelle
Dies hilft Ihnen dabei, den ersten oder Standardwert in Ihrer Linq List-Suche zu erhalten
Diese Suche findet den ersten oder Standardwert, den sie zurückgibt.
quelle
Sie möchten ein Objekt in der Objektliste suchen.
Dies hilft Ihnen dabei, den ersten oder Standardwert in Ihrer Linq List-Suche zu erhalten.
oder
quelle
Sie können FirstOfDefault mit der Where Linq-Erweiterung verwenden, um eine MessageAction-Klasse aus dem IEnumerable abzurufen. Reme
var action = Message.Actions.Where (e => e.targetByName == className) .FirstOrDefault ();
wo
Aktionen auflisten {get; einstellen; }}
quelle