297 Stimmen

Suche nach dem Vorhandensein eines Wertes in einer Liste von Objekten mit Linq

Angenommen, ich habe eine Klasse Customer die eine Eigenschaft hat FirstName . Dann habe ich eine List<Customer> .

Kann LINQ verwendet werden, um festzustellen, ob die Liste einen Kunden mit Firstname = 'John' in einer einzigen Aussage wie?

575voto

Andriy Volkov Punkte 18140

LINQ definiert eine Erweiterungsmethode, die sich perfekt für die Lösung genau dieses Problems eignet:

using System.Linq;
...
    bool has = list.Any(cus => cus.FirstName == "John");

Vergewissern Sie sich, dass Sie auf System.Core.dll verweisen, denn dort befindet sich LINQ.

30 Stimmen

Any ist gut. Ich frage mich, wie viele Entwickler Count verwenden, wenn sie Any verwenden sollten?

19 Stimmen

Sie können auch eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung durchführen: cus => cus.FirstName.Equals("John", StringComparison.CurrentCultureIgnoreCase)

2 Stimmen

Ich weiß, dass dies eine alte Frage ist, aber warum verwenden wir nicht die Methode "Exists"? Sie ist doch dazu da, um zu sehen, ob Dinge existieren.

126voto

Jon Skeet Punkte 1325502

Die Antwort von zvolkov ist die richtige, um das herauszufinden wenn es einen solchen Kunden gibt. Wenn Sie brauchen verwenden. der Kunde danach, können Sie tun:

Customer customer = list.FirstOrDefault(cus => cus.FirstName == "John");
if (customer != null)
{
    // Use customer
}

Ich weiß, das ist nicht die Frage, die Sie gestellt haben, aber ich dachte, ich komme einer Folgefrage zuvor :) (Natürlich findet dies nur die erste solche Kunden... um sie alle zu finden, verwenden Sie einfach eine normale where Klausel).

8 Stimmen

Ich möchte darauf hinweisen, dass Sie dies später bei der Fehlersuche zu schätzen wissen, wenn Sie sich plötzlich fragen, welcher Kunde die Kriterien erfüllt hat.

1 Stimmen

Ich habe diese Antwort nur einen Schritt nach oben verschoben, weil ich es toll finde, wie die SO-Gemeinschaft einen zusätzlichen Schritt macht, um der Frage/Antwort noch mehr hinzuzufügen.

1 Stimmen

Danke, es hat mir geholfen, aber manchmal möchte ich einfach nur bool Ergebnis, so dass in diesem Fall .Any o .FindIndex verwendet wird ici die schnell ist ?

29voto

Mike Sackton Punkte 1074

Eine Option für die Folgefrage (wie findet man einen Kunden, der eine beliebige Anzahl von Vornamen haben könnte):

List<string> names = new List<string>{ "John", "Max", "Pete" };
bool has = customers.Any(cus => names.Contains(cus.FirstName));

oder um den Kunden aus einer csv-Datei mit einer ähnlichen Liste abzurufen

string input = "John,Max,Pete";
List<string> names = input.Split(',').ToList();
customer = customers.FirstOrDefault(cus => names.Contains(cus.FirstName));

10voto

jmservera Punkte 6254

Mit Linq haben Sie viele Möglichkeiten, hier eine ohne die Verwendung von Lambdas:

//assuming list is a List<Customer> or something queryable...
var hasJohn = (from customer in list
         where customer.FirstName == "John"
         select customer).Any();

7voto

Chris Brandsma Punkte 11525
customerList.Any(x=>x.Firstname == "John")

0 Stimmen

Dies beantwortet nicht die Frage, "ob" ein solcher Eintrag existiert; es zählt lediglich die Werte auf, falls sie existieren. Ein zusätzlicher Schritt ist erforderlich, um festzustellen, ob diese Aufzählung nicht leer ist.

0 Stimmen

Ändern Sie dann Where in Any. Wahrscheinlich ist das für mich eher philosophisch. Ich muss selten wissen, ob, ohne mich darum zu kümmern, welche es sind. @jmservera: Du hattest Recht. Ich habe LINQ vor einer Weile aufgegeben und verwende jetzt ausschließlich Lambda.

0 Stimmen

Ich will nicht pedantisch sein, wenn ich sage, dass die Verwendung der Lambda-Aufrufe technisch gesehen immer noch LINQ ist. (Insbesondere verwenden Sie LINQ-to-Objects.) Sie verwenden nur die Methodenaufrufe und nicht die Sprachschlüsselwörter.

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