Ich liebe string.IsNullOrEmpty
Methode. Ich hätte gerne etwas, das die gleiche Funktionalität für IEnumerable ermöglicht. Gibt es solche? Vielleicht eine Sammelhelferklasse? Der Grund, den ich frage, ist, dass in if
Anweisungen der Code unübersichtlich aussieht, wenn das Muster ist (mylist != null && mylist.Any())
. Es wäre viel sauberer zu haben Foo.IsAny(myList)
.
Dieser Beitrag gibt diese Antwort nicht: IEnumerable ist leer? .
c#
.net
linq
collections
ienumerable
Schultz9999
quelle
quelle
Antworten:
Sicher könnten Sie das schreiben:
Seien Sie jedoch vorsichtig, dass nicht alle Sequenzen wiederholbar sind. Im Allgemeinen gehe ich lieber nur einmal spazieren, nur für den Fall.
quelle
this
dort fallen lassen - ich betrachte Erweiterungsmethoden, von denen angenommen wird, dass sienull
als Zeichen für hässliches Design aufgerufen werden ..Any()
ist eine Erweiterungsmethode, die ausgeführt wirdIEnumerable<T>
(oderIQueryable<T>
, obwohl dies ein anderes Szenario ist). Dadurch wird die Sequenz zumindest teilweise verbraucht (obwohl dies immer noch bedeutet, dass sie verbraucht ist) - möglicherweise muss nur ein Element gelesen werden (insbesondere, wenn kein Prädikat vorhanden ist). Da Sequenzen (IEnumerable<T>
) nicht wiederholbar sein müssen , könnte dies der Fall sein .Any()
ohne Prädikat ist im Wesentlichen gleichbedeutend mitforeach(var x in sequence) { return true; } return false;
- obwohl esGetEnumerator()
etc anstelle der Compilersyntax verwendetquelle
IEnumerable
hat keineAny()
Erweiterung.Hier ist eine modifizierte Version der nützlichen Antwort von @Matt Greer, die eine statische Wrapper-Klasse enthält, sodass Sie diese einfach kopieren und in eine neue Quelldatei einfügen können, nicht von Linq abhängig sind und eine generische
IEnumerable<T>
Überladung hinzufügen , um das Boxen von Werttypen zu vermeiden das würde mit der nicht generischen Version auftreten. [BEARBEITEN: Beachten Sie, dass die Verwendung vonIEnumerable<T>
das Boxen des Enumerators nicht verhindert. Die Ententypisierung kann dies nicht verhindern, aber zumindest die Elemente in einer werttypisierten Sammlung werden nicht jeweils boxen.]quelle
Eine andere Möglichkeit wäre, den Enumerator abzurufen und die MoveNext () -Methode aufzurufen, um festzustellen, ob Elemente vorhanden sind:
Dies funktioniert sowohl für IEnumerable als auch für IEnumerable <T>.
quelle
IEnumerable<T>
, da nicht generischeIEnumerable
nicht implementiert werdenIDisposable
.So mache ich es und nutze einige moderne C # -Funktionen:
Option 1)
Option 2)
Übrigens, verwenden Sie niemals
Count == 0
oderCount() == 0
nur, um zu überprüfen, ob eine Sammlung leer ist. Verwenden Sie immer Linqs.Any()
quelle
!
kann, insbesondere in der zweiten Option;)Dies kann helfen
quelle
Ab C # 6 können Sie die Nullweitergabe verwenden :
myList?.Any() == true
Wenn Sie dies immer noch zu verstopft finden oder eine gute alte Erweiterungsmethode bevorzugen, würde ich die Antworten von Matt Greer und Marc Gravell empfehlen, der Vollständigkeit halber jedoch mit etwas erweiterter Funktionalität.
Ihre Antworten bieten die gleiche Grundfunktionalität, jedoch jeweils aus einer anderen Perspektive. Matts Antwort verwendet die
string.IsNullOrEmpty
-mentalität, während Marc's Antwort Linqs verwendet.Any()
Weg nimmt, um die Arbeit zu erledigen.Ich persönlich bin geneigt, die
.Any()
Straße zu benutzen , möchte aber die Zustandsüberprüfungsfunktionalität aus der anderen Überlastung der Methode hinzufügen :Sie können also immer noch Dinge tun wie:
myList.AnyNotNull(item=>item.AnswerToLife == 42);
wie beim normalen.Any()
aber mit dem hinzugefügten Null-CheckBeachten Sie, dass mit der C # 6-Methode: eher a als a
myList?.Any()
zurückgibt , was der tatsächliche Effekt der Weitergabe von null istbool?
bool
quelle
quelle
Hier ist der Code aus Marc Gravells Antwort sowie ein Beispiel für die Verwendung.
Wie er sagt, sind nicht alle Sequenzen wiederholbar, so dass Code manchmal Probleme verursachen kann, da er
IsAny()
anfängt, die Sequenz zu durchlaufen. Ich vermute, was Robert Harveys Antwort bedeutete, war, dass Sie oft nicht nach etwas suchennull
und es leeren müssen. Oft kann man einfach nach null suchen und dann verwendenforeach
.Um zu vermeiden, dass die Sequenz zweimal gestartet und ausgenutzt wird
foreach
, habe ich einfach folgenden Code geschrieben:Ich denke, die Erweiterungsmethode erspart Ihnen ein paar Zeilen beim Schreiben, aber dieser Code scheint mir klarer zu sein. Ich vermute, dass einige Entwickler nicht sofort erkennen würden, dass dies
IsAny(items)
tatsächlich die Sequenz durchläuft. (Wenn Sie viele Sequenzen verwenden, lernen Sie natürlich schnell, darüber nachzudenken, welche Schritte sie durchlaufen.)quelle
Ich benutze
Bool IsCollectionNullOrEmpty = !(Collection?.Any()??false);
. Hoffe das hilft.Nervenzusammenbruch:
Collection?.Any()
wird zurückgegeben,null
wenn Collection null ist undfalse
wenn Collection leer ist.Collection?.Any()??false
wird uns geben,false
wenn die Sammlung leer ist undfalse
wenn die Sammlung leer istnull
.Ergänzung dazu wird uns geben
IsEmptyOrNull
.quelle
Jon Skeets Antwort ( https://stackoverflow.com/a/28904021/8207463 ) hat einen guten Ansatz unter Verwendung der Erweiterungsmethode - Any () für NULL und EMPTY. ABER er validiert den Fragenbesitzer für den Fall, dass NICHT NULL ist. Ändern Sie daher Jons Ansatz sorgfältig, um AS NULL zu validieren:
NICHT verwenden (wird nicht als NULL validiert):
Sie können auch für den Fall, dass die Validierung AS NOT NULL (NICHT nur als Beispiel getestet, aber ohne Compilerfehler) Folgendes tun: Prädikat verwenden:
https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8788153112b7ffd0
Für welche .NET-Version Sie sie verwenden können, überprüfen Sie bitte:
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.any?view=netframework-4.8#moniker-applies-to
quelle
Ich hatte das gleiche Problem und löse es wie folgt:
"c => c! = null" ignoriert alle Null-Entitäten.
quelle
Ich habe das aus dem gebaut Antwort von @Matt Greer aufgebaut
Er beantwortete die Frage des OP perfekt.
Ich wollte so etwas unter Beibehaltung der ursprünglichen Funktionen von Any und gleichzeitig nach Null suchen. Ich poste dies für den Fall, dass jemand anderes etwas Ähnliches benötigt.
Insbesondere wollte ich immer noch in der Lage sein, ein Prädikat weiterzugeben.
Die Benennung der Erweiterungsmethode könnte wahrscheinlich besser sein.
quelle
Die andere beste Lösung wie unten, um leer zu prüfen oder nicht?
quelle
listEnumerable
null ist, was die Frage istIch benutze dieses:
Ejem:
quelle
Da einige Ressourcen nach einem Lesevorgang erschöpft sind, dachte ich mir, warum man nicht die Prüfungen und die Lesevorgänge anstelle der herkömmlichen separaten Prüfung kombiniert und dann liest.
Zuerst haben wir eine für die einfachere Check-for-Null-Inline-Erweiterung:
Dann haben wir die etwas kompliziertere Inline-Erweiterung "Check-for-Null-and-Empty" (zumindest so, wie ich es geschrieben habe):
Sie können natürlich weiterhin beide anrufen, ohne die Anrufkette fortzusetzen. Außerdem habe ich den paramName eingefügt, damit der Aufrufer einen alternativen Namen für den Fehler angeben kann, wenn nicht "source" überprüft wird, z. B. "nameof (target)".
quelle
meine eigene Erweiterungsmethode, um Not null und Any zu überprüfen
quelle
Ohne benutzerdefinierte Helfer empfehle ich entweder
?.Any() ?? false
oder?.Any() == true
die relativ präzise sind und die Reihenfolge nur einmal angeben müssen.Wenn ich eine fehlende Sammlung wie eine leere behandeln möchte, verwende ich die folgende Erweiterungsmethode:
Diese Funktion kann mit allen LINQ-Methoden kombiniert werden und
foreach
nicht nur.Any()
, weshalb ich sie den spezielleren Hilfsfunktionen vorziehe, die hier vorgeschlagen werden.quelle
ich benutze
Das Ergebnis ist null, wenn keine Übereinstimmung vorliegt. Andernfalls wird eines der Objekte zurückgegeben
Wenn Sie die Liste wollten, glaube ich, dass das Verlassen von First () oder das Aufrufen von ToList () die Liste oder null liefert.
quelle
Schauen Sie sich diese OpenSource-Bibliothek an: Nzr.ToolBox
quelle
using System.Linq
Fügen Sie einfach hinzu und sehen Sie, wie die Magie geschieht, wenn Sie versuchen, auf die verfügbaren Methoden in der zuzugreifenIEnumerable
. Wenn Sie dies hinzufügen, erhalten Sie Zugriff auf eineCount()
so einfache Methode . Denken Sie daran, dies zu überprüfen,null value
bevor Sie anrufencount()
:)quelle
Ich habe einfach verwendet, um danach zu suchen
Schau dir meine Lösung an
quelle