Mischen Any () und First () in LINQ?

8

Erstens, ich bin ein Anfänger in LINQ! Dann ist die Sache, dass ich eine Sammlung habe, die:

  1. enthält entweder nicht meine ID (string)
  2. oder enthält es nur einmal

Ich wollte Where verwenden, aber ich mag die if Instruktionen nicht, die ich tun muss ... also hier ist mein Code:

%Vor%

Das funktioniert, aber ich habe das Gefühl, dass das nicht so ist, wie ich es mit LINQ machen sollte ... Irgendwelche Vorschläge?

    
Guillaume Slashy 10.01.2012, 09:12
quelle

7 Antworten

16

Antwort einer nicht eindeutigen Entität (mit der Ausnahme, dass mehrere Instanzen verworfen werden)

Verwenden Sie SingleOrDefault . Dies wird das eindeutige Element zurückgeben, wenn es existiert, null, wenn es nicht existiert, oder es wird ausgelöst und die Ausnahme, wenn es mehr als eins gibt.

%Vor%

Eindeutige Eigenschaft Antwort (es wird niemals mehrere Instanzen geben)

Wenn Ihr System so eingerichtet ist, dass BaseName eine eindeutige Entität ist, Benutzer FirstOrDefault , wird keine Ausnahme ausgelöst, wenn es mehrere gibt, da es bei der ersten Instanz stoppt, aber das System wird entworfen es wird also nie dieselbe Instanz geben, also wäre es akzeptabel (und zeitaufwendig).

%Vor%     
ThePower 10.01.2012, 09:14
quelle
12

Wie ThePower sagt, sollten Sie SingleOrDefault oder vielleicht %Co_de% . Wenn es wirklich nur einen solchen Eintrag gibt, werden sie das gleiche tun, aber FirstOrDefault ist möglicherweise schneller, wenn Sie LINQ to Objects verwenden - FirstOrDefault müsste die komplette Sequenz durchsehen, um zu prüfen, ob es einen gibt. t irgendwelche anderen Übereinstimmungen.

Wenn mehrere Übereinstimmungen vorhanden sind, löst SingleOrDefault eine Ausnahme aus; SingleOrDefault gibt nur die erste Übereinstimmung zurück.

So könnten Sie verwenden:

%Vor%

Beachten Sie, dass dies umständlich sein kann, wenn Ihr Sequenzelementtyp ein Werttyp ist, da Sie möglicherweise nicht zwischen dem Standardwert für den Elementtyp aufgrund fehlender Übereinstimmungen und einem "echten" Wert unterscheiden können. Es sieht so aus, als wäre das in diesem Fall kein Problem, aber es lohnt sich, daran zu denken.

    
Jon Skeet 10.01.2012 09:18
quelle
5
%Vor%

Hier ist tmp Null, wenn Sie keinen solchen Datensatz haben.

    
Haris Hasan 10.01.2012 09:14
quelle
2

können Sie verwenden,

%Vor%

oder

%Vor%     
Chamika Sandamal 10.01.2012 09:17
quelle
1

verwende FirstOrDefault(rm => rm.BaseName == rbName);

msdn link

    
Tjassens 10.01.2012 09:15
quelle
1

Any gibt bool zurück, um anzugeben, ob solche Elemente vorhanden sind. First gibt den Datensatz aus Ihrer Sammlung zurück. In jedem Fall haben Sie ein Objekt aus der Sammlung und Ihr Zustand resultiert. Sie können FirstOrDefault verwenden und dann auf null den zurückgegebenen Wert prüfen.

%Vor%     
Samich 10.01.2012 09:16
quelle
1
%Vor%     
Mark 10.01.2012 09:18
quelle

Tags und Links