values validar not framework check c# linq null

c# - validar - Compruebe si KeyValuePair existe con FirstOrDefault de LINQ



linq where null values (6)

Tengo un diccionario de tipo

Dictionary<Guid,int>

Quiero devolver la primera instancia donde se cumple una condición usando

var available = m_AvailableDict.FirstOrDefault(p => p.Value == 0)

Sin embargo, ¿cómo puedo verificar si en realidad estoy recibiendo un KeyValuePair? Parece que no puedo usar! = Or == para verificar contra el valor predeterminado (KeyValuePair) sin un error de compilación. Aquí hay un hilo similar que parece no tener solución. De hecho, puedo resolver mi problema particular obteniendo la clave y comprobando el valor predeterminado de Guid, pero tengo curiosidad de saber si hay una buena forma de hacerlo con el par de valores clave. Gracias


Lo que quiere es un método Any que también le proporcione el elemento correspondiente. Puede escribir fácilmente este método usted mismo.

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; } }


Si solo te importa la existencia, podrías usar ContainsValue(0) o Any(p => p.Value == 0) lugar? La búsqueda por valor es inusual para un Dictionary<,> ; si TryGetValue por clave, podrías usar TryGetValue .

Otro enfoque:

var record = data.Where(p => p.Value == 1) .Select(p => new { Key = p.Key, Value = p.Value }) .FirstOrDefault();

Esto devuelve una clase , por lo que será null si no se encuentra.


Te sugiero que lo cambies de esta manera:

var query = m_AvailableDict.Where(p => p.Value == 0).Take(1).ToList();

A continuación, puede ver si la lista está vacía o no, y tomar el primer valor si no está, por ejemplo

if (query.Count == 0) { // Take action accordingly } else { Guid key = query[0].Key; // Use the key }

Tenga en cuenta que no existe un concepto real de una "primera" entrada en un diccionario: el orden en el que se itera no está bien definido. Si desea obtener el par de clave / valor que se ingresó por primera vez con ese valor, necesitará algún tipo de diccionario de preservación de órdenes.

(Esto supone que realmente quiere saber la clave; si está buscando una comprobación de existencia, la solución de Marc es la más adecuada).


Una forma de verificar el valor predeterminado de una estructura como KeyValuePair sin especificar el tipo es crear una nueva instancia usando Activator:

if (available.Equals(Activator.CreateInstance(available.GetType()))) { Console.WriteLine("Not Found!"); }


Use la palabra clave predeterminada ().

bool exists = !available.Equals(default(KeyValuePair<Guid, int>));


puedes verificar si

available.Key==Guid.Empty