Wenn alle Elemente in einer Liste denselben Wert haben, muss ich diesen Wert verwenden, andernfalls muss ich einen „anderen Wert“ verwenden. Ich kann mir keinen einfachen und klaren Weg vorstellen, dies zu tun.
121
Wenn alle Elemente in einer Liste denselben Wert haben, muss ich diesen Wert verwenden, andernfalls muss ich einen „anderen Wert“ verwenden. Ich kann mir keinen einfachen und klaren Weg vorstellen, dies zu tun.
Antworten:
Die sauberste Art, die ich mir vorstellen kann. Sie können es zu einem Einzeiler machen, indem Sie val einfügen, aber First () wird n-mal ausgewertet, wodurch die Ausführungszeit verdoppelt wird.
Um das in den Kommentaren angegebene Verhalten "leerer Satz" zu berücksichtigen, fügen Sie einfach eine weitere Zeile vor den beiden oben genannten hinzu:
quelle
.Any
zulassen, dass die Aufzählung in Fällen mit unterschiedlichen Werten vorzeitig beendet wird?All
wird beendet, sobald es ein Elementx
der Sequenz trifft , für dasx.Value != val
. In ähnlicher WeiseAny(x => x.Value != val)
würde enden, sobald es ein Elementx
der Sequenz trifft , für diex.Value != val
. Das heißt, beideAll
undAny
weisen einen "Kurzschluss" analog zu&&
und auf||
(was effektiv was istAll
undAny
ist).return yyy.Skip(1).All(x=>x.Value == val) ? val : otherValue;
Guter Schnelltest für alle gleich:
quelle
Class
, obwohl es mit Strukturen funktionieren sollte. Ideal für eine Liste von Grundelementen.collection.Distinct().Count() <= 1
wenn Sie leere Sammlungen zulassen möchten..Distinct()
funktioniert nicht immer wie erwartet - besonders wenn Sie mit Objekten arbeiten, lesen Sie diese Frage. In diesem Fall müssen Sie die IEquatable-Schnittstelle implementieren.Distinct
wird die Sammlung überhaupt nicht durchlaufen, und esCount
wird eine Durchquerung überDistinct
den Iterator durchgeführt.Obwohl Sie ein solches Gerät sicherlich aus vorhandenen Sequenzoperatoren erstellen können, wäre ich in diesem Fall geneigt, dieses als benutzerdefinierten Sequenzoperator zu schreiben. Etwas wie:
Das ist ziemlich klar, kurz, deckt alle Fälle ab und erzeugt nicht unnötig zusätzliche Iterationen der Sequenz.
Dies zu einer generischen Methode zu machen, die funktioniert,
IEnumerable<T>
bleibt als Übung übrig. :-)quelle
other
wenn dasnull
tatsächlich die (vermutlich) richtige Antwort war. Angenommen, die Funktion warT Unanimous<U, T>(this IEnumerable<U> sequence, T other)
oder eine solche Signatur, die es ein wenig kompliziert.Oder wenn Sie sich Sorgen machen, First () für jedes Element auszuführen (was ein gültiges Leistungsproblem sein könnte):
quelle
Dies mag spät sein, aber eine Erweiterung, die für Wert- und Referenztypen gleichermaßen funktioniert, basierend auf Erics Antwort:
quelle
quelle
Eine Alternative zur Verwendung von LINQ:
Ich habe festgestellt, dass die Verwendung
HashSet<T>
für Listen mit bis zu ~ 6.000 Ganzzahlen schneller ist als:quelle
HashSet<T>
anfangs schneller ist als die Verwendung der LINQ-Anweisungen in meiner Antwort. Wenn ich dies jedoch in einer Schleife mache, ist LINQ schneller.GetHashCode()
, was schwierig korrekt durchzuführen ist. Weitere Informationen finden Sie unter: stackoverflow.com/a/371348/2607840 .Eine geringfügige Abweichung vom obigen vereinfachten Ansatz.
var result = yyy.Distinct().Count() == yyy.Count();
quelle
Wenn ein Array vom Typ Multidimension wie unten ist, müssen wir unter linq schreiben, um die Daten zu überprüfen.
Beispiel: Hier sind die Elemente 0 und ich überprüfe, ob alle Werte 0 sind oder nicht.
ip1 =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0 0 0
quelle