64 Stimmen

Im LINQ alle Werte der Eigenschaft X auswählen, bei denen X != null ist

Gibt es einen kürzeren Weg, um das Folgende zu schreiben? (Etwas, das auf Null überprüft, ohne explizit != null zu schreiben)

from item in list 
where item.MyProperty != null 
select item.MyProperty

11 Stimmen

Gibt es einen Grund, warum du nicht möchtest, dass der Code explizit darüber ist, was er tut?

0 Stimmen

Ich kenne keinen kürzeren Weg. Aber auch Ihre Version gilt allgemein als "lang".

0 Stimmen

Das ist ziemlich einfach. Aber wenn ein einzelnes Element in der Liste null ist, erhalten Sie eine NRE. Ihre where-Klausel muss sein item != null && item.MyProperty != null.

3voto

Jorge Santos Punkte 46

Eine Spalte im distinct Select erhalten und Nullwerte ignorieren:

 var items = db.table.Where(p => p.id!=null).GroupBy(p => p.id)
                                .Select(grp => grp.First().id)
                                .ToList();

1voto

Doug Domeny Punkte 4340

Dies stammt von CodesInChaos's Erweiterungsmethode ab. Der Name ist kürzer (NotNull) und noch wichtiger, beschränkt den Typ (T) auf Referenztypen mit where T : class.

    public static IEnumerable NotNull(this IEnumerable source) where T : class
    {
        return source.Where(item => item != null);
    }

2 Stimmen

Wenn Sie abstimmen, geben Sie bitte an, warum. Abstimmen ohne Grund entmutigt nur Beiträge. Wenn etwas falsch oder unvollständig ist, sagen Sie es. Wenn Sie eine andere Antwort bevorzugen, stimmen Sie einfach für diese andere Antwort.

1 Stimmen

1) Ich habe nicht gevotet, aber die Beschränkung auf Verweistypen ist meiner Meinung nach keine gute Idee. Es verhindert die Verwendung dieser Methode bei nullbaren Werttypen, was besonders ärgerlich ist, wenn Sie diese Methode in einer anderen generischen Methode verwenden möchten, bei der T nicht eingeschränkt wurde. 2) Mir gefällt auch die Namensänderung nicht besonders. Mit diesem Namen würde ich erwarten, dass überprüft wird, ob source != null ist, und nicht, ob die Elemente nicht null sind.

0 Stimmen

@CodesInChaos, danke für die gut durchdachten Kommentare. Sie werden geschätzt. Leider hat C# (derzeit) keine Einschränkung für nullable.

1voto

lukger Punkte 374

Ich weiß, ich bin etwas spät dran, aber ich habe eine meiner Meinung nach sehr elegante Lösung für dieses Problem gefunden. Ich habe eine Erweiterungsmethode geschrieben, um sie an meine LINQ-Abfragen anzuhängen:

public static IEnumerable DiscardNullValues(this IEnumerable nullable)
    {
        foreach (var item in nullable)
        {
            if (item is not null) yield return item;
        }
    }

Funktioniert wie ein Zauber.

0voto

cube45 Punkte 2756

Dies ist ein Feature, das dem Problemverfolgungssystem von dotnet/runtime vorgeschlagen wurde.

Siehe diesen Kommentar, der eine SelectNotNull Funktion vorschlägt: https://github.com/dotnet/runtime/issues/30381#issuecomment-806396119

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