SingleOrDefault gibt null zurück, aber was, wenn ich Werte zuweisen möchte, um das Objekt zu repräsentieren, das nicht gefunden wurde?SingleOrDefault: Wie können die Standardwerte geändert werden?
Antwort
Sie könnten Ihre eigenen rollen.
public static T SingleOrDefault<T>(this IEnumerable<T> enumerable, T defaultValue) {
if (1 != enumerable.Count()) {
return defaultValue;
}
return enumerable.Single();
}
Dies kann aber ein bisschen teuer sein, weil Count() erfordert, dass Sie die gesamte Kollektion zu verarbeiten und kann ziemlich teuer sein zu laufen. Es wäre besser, entweder Einzel nennen, die InvalidOperationException fangen oder rollen eine IsSingle Methode
public static bool IsSingle<T>(this IEnumerable<T> enumerable) {
using (var e = enumerable.GetEnumerator()) {
return e.MoveNext() && !e.MoveNext();
}
}
public static T SingleOrDefault<T>(this IEnumerable<T> enumerable, T defaultValue) {
if (!enumerable.IsSingle()) {
if(enumerable.IsEmpty()) {
return defaultValue;
}
throw new InvalidOperationException("More than one element");
}
return enumerable.Single();
}
Dies würde den Standardwert zurückgeben, wenn das Enumerable mehrere Objekte enthält. Sollte es nicht eine Ausnahme wie die Standard-Implementierung auslösen? – tvanfosson
@tvanfosson ja sollte es. Ich hatte den Eindruck, dass SingleOrDefault den Standardwert zurückgeben würde, wenn es etwas anderes als ein Element gäbe. Aber es wird anscheinend nur für keine Elemente tun. Seltsam, ich werde aktualisieren. – JaredPar
Sie könnten Ihre eigene Erweiterung erstellen Methoden tun können - Einfach oder Neu.
public static class IEnumerableExtensions
{
public static T SingleOrNew<T>(this IEnumerable<T> enumeration, T newValue)
{
T elem = enumeration.SingleOrDefault();
if (elem == null)
{
return newValue;
}
return elem;
}
public static T SingleOrNew<T>(this IEnumerable<T> enumeration, Func<T,bool> predicate, T newValue)
{
T elem = enumeration.SingleOrDefault(predicate);
if (elem == null)
{
return newValue;
}
return elem;
}
}
Das Problem bei diesem Ansatz besteht jedoch darin, dass Sie den newValue-Parameter für eine Auflistung zurückgeben, die ein einzelnes Element mit dem Wert null enthält. Betrachten Sie diesen Ausdruck (new string [] {null}). SingleOrNew ("foo") ;. Es würde fälschlicherweise "foo" – JaredPar
@ JaredPar zurückgeben - ich bin bereit, damit zu leben. Im Allgemeinen setze ich keine Nullen in meine Sammlungen und wenn ich eine solche Methode verwenden sollte, würde ich sie wahrscheinlich sowieso durch meinen Standardwert ersetzen. – tvanfosson
@tvanfosson, das ist eine ziemlich deutliche Bruchänderung gegenüber dem ursprünglichen Algorithmus, die eine heftige Annahme darüber macht, wie Menschen null verwenden. – JaredPar
?? operator. Wenn das linke Argument null ist, werte es aus und gebe das zweite Argument zurück.
myCollection.SingleOrDefault() ?? new[]{new Item(...)}
Dies wird nur mit Referenztypen (oder nullables) arbeiten, aber es täte, was man sehr einfach suchen.
Ein kleiner Applaus klingt in meinem Kopf ab, wenn ich null Koaleszenz benutzen kann. +1 – Stimul8d
@Joe Ich denke, dass das OP tatsächlich den Standardwert ändern möchte, der direkt von SingleOrDefault() zurückgegeben wird, z. Wenn nach einem Person-Objekt gesucht wird und keine existiert, möchte er möglicherweise SingleOrDefault() ein NullPerson-Objekt zurückgeben. Mein Verständnis ist, dass es nicht möglich ist, den Rückgabetyp zu ändern und das Problem muss so gelöst werden, wie Sie es getan haben, aber ich denke, es ist wichtig für das OP zu klären, dass der Standard-Rückgabewert von SingleOrDefault() nicht sein kann geändert. – Matt
- 1. Welche Standardwerte können an die Environment.Exit-Methode übergeben werden?
- 2. Wie können Benutzeranmeldeinformationen in Subclipse geändert werden?
- 3. Wie können Validierungsfehlerreaktionen in DRF geändert werden?
- 4. Wie können die Werte von JsonObject/JsonArray direkt geändert werden?
- 5. Wie können die Farben eines Bildes mit CSS3 geändert werden?
- 6. Wie können die Standard-Visual Studio-Konfigurationen geändert werden?
- 7. Wie können Standardwerte in Sequel-Modellen festgelegt werden?
- 8. Java-Ergonomie: Wie werden Standardwerte berechnet?
- 9. Bootstrap-Designelemente können nicht geändert werden Farbe
- 10. Warum können Standardwerte in überschriebenen Elementfunktionen von Untertypen weggelassen werden?
- 11. Können CSS-Werte relativ geändert werden?
- 12. Können die Mediensteuerelemente des Standard-MediaElement-Steuerelements geändert werden?
- 13. Braintree: Können die Probezeiten von Abonnements geändert werden?
- 14. Parameter können in Rmd-Dokumenten nicht geändert werden
- 15. Wie können in einem Android-Bibliotheksprojekt definierte Zeichen geändert werden?
- 16. Wie können Etiketteneinschränkungen während der Laufzeit geändert werden?
- 17. Wie können Cortana Sprachaktivierungsbefehle (XML) in C# geändert werden?
- 18. Wie können Standard-Aufzählungszeichen in Impress geändert werden?
- 19. Wie werden die Eigenschaften nicht geändert oder geändert?
- 20. Wie können Animationen geändert werden, die vom animateLayoutChanges-Mechanismus verwendet werden?
- 21. Wie kann die Template-Instanziierungsreihenfolge geändert werden?
- 22. Wie können Facettenbeschriftungen für zwei Variablen geändert und/oder geändert werden?
- 23. Ruby: Können Lambda-Funktionsparameter Standardwerte haben?
- 24. SingleOrDefault() wenn die Sequenz den Standardwert enthält
- 25. Android: mit registerContentObserver() benachrichtigt werden, wie die Kontakte geändert werden
- 26. Können NLog-Variablen programmatisch geändert werden, wenn Common.Logging verwendet wird?
- 27. Best Practice von SingleOrDefault()
- 28. IOS - in drawRect Func Layer-Eigenschaften können nicht geändert werden?
- 29. numpy.convolve Python alte Zahlen können nicht geändert werden
- 30. LINQ SingleOrDefault in Typescript
Haben Sie eine Antwort gefunden? Sie können den Standard nicht als Versprechen nach Methode ändern. weil SingleOrDefault SingleOrNNull sein sollte, aber es Wertobjekt zurückgeben kann. wer kann zurückgeben 0 für int, ist es Standard oder angebliche Zahl? SingleOrDefault kann 0 zurückgeben, aber es muss nicht Standard sein. gibt null zurück oder nicht. Es ist ein schlechtes Paradigma für OOP. –