Ich habe ein Wörterbuch vom Typ
Dictionary<Guid,int>
Ich möchte die erste Instanz zurückgeben, in der eine Bedingung erfüllt ist
var available = m_AvailableDict.FirstOrDefault(p => p.Value == 0)
Wie überprüfe ich jedoch, ob ich tatsächlich ein KeyValuePair zurückerhalte? Ich kann anscheinend nicht! = Oder == verwenden, um ohne einen Compilerfehler gegen die Standardeinstellung (KeyValuePair) zu prüfen. Es gibt einen ähnlichen Thread hier , die nicht ganz scheint eine Lösung zu haben. Ich bin tatsächlich in der Lage, mein spezielles Problem zu lösen, indem ich den Schlüssel erhalte und die Standardeinstellung von Guid überprüfe, aber ich bin gespannt, ob es eine gute Möglichkeit gibt, dies mit dem Schlüsselwertpaar zu tun. Vielen Dank
.Where()
und verwenden Sie es dann.Any()
, um zu entscheiden, ob Sie ein Ergebnis zurückbekommen haben oder nicht.Antworten:
Wenn Sie sich nur um die Existenz kümmern, könnten Sie
ContainsValue(0)
oderAny(p => p.Value == 0)
stattdessen verwenden? Die Suche nach Wert ist ungewöhnlich für aDictionary<,>
; Wenn Sie nach Schlüssel suchen, können Sie verwendenTryGetValue
.Ein anderer Ansatz:
var record = data.Where(p => p.Value == 1) .Select(p => new { Key = p.Key, Value = p.Value }) .FirstOrDefault();
Dies gibt eine Klasse zurück - so wird es sein,
null
wenn es nicht gefunden wird.quelle
var
eine Struktur durch einen anonymen Typ ohne Referenzkorrekturen ersetzen können, wie Sie es oben getan haben.p => new { p.Key, p.Value }
Ich schlage vor, Sie ändern es auf folgende Weise:
var query = m_AvailableDict.Where(p => p.Value == 0).Take(1).ToList();
Sie können dann sehen, ob die Liste leer ist oder nicht, und den ersten Wert annehmen, wenn dies nicht der Fall ist, z
if (query.Count == 0) { // Take action accordingly } else { Guid key = query[0].Key; // Use the key }
Beachten Sie, dass es kein wirkliches Konzept für einen "ersten" Eintrag in einem Wörterbuch gibt - die Reihenfolge, in der er iteriert wird, ist nicht genau definiert. Wenn Sie das Schlüssel / Wert-Paar erhalten möchten, das zuerst mit diesem Wert eingegeben wurde, benötigen Sie ein auftragserhaltendes Wörterbuch.
(Dies setzt voraus, dass Sie den Schlüssel tatsächlich wissen möchten. Wenn Sie sich gerade nach einer Existenzprüfung befinden, ist Marc's Lösung am besten geeignet.)
quelle
Verwenden Sie das Schlüsselwort default ().
bool exists = !available.Equals(default(KeyValuePair<Guid, int>));
quelle
Was Sie wollen, ist eine
Any
Methode, die Ihnen auch das passende Element gibt. Sie können diese Methode einfach selbst schreiben.public static class IEnumerableExtensions { public static bool TryGetFirst<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, out TSource first) { foreach (TSource item in source) { if (predicate(item)) { first = item; return true; } } first = default(TSource); return false; } }
quelle
Sie könnten überprüfen, ob
quelle
Eine Möglichkeit, den Standardwert einer Struktur wie KeyValuePair zu überprüfen, ohne den Typ anzugeben, besteht darin, mit Activator eine neue Instanz zu erstellen:
if (available.Equals(Activator.CreateInstance(available.GetType()))) { Console.WriteLine("Not Found!"); }
quelle