检查是否存在与LINQ的FirstOrDefault KeyValuePair

我有一个types的字典

Dictionary<Guid,int> 

我想返回一个条件满足使用的第一个实例

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

但是,如何检查我是否真的找回KeyValuePair? 我似乎无法使用!=或==检查与默认(KeyValuePair)没有编译器错误。 这里有一个类似的线程,似乎没有一个解决scheme。 我实际上能够通过获取关键字和检查Guid的默认值来解决我的特定问题,但是我很好奇是否有一个用keyvaluepair做这个的好方法。 谢谢

如果你只关心存在,你可以使用ContainsValue(0)Any(p => p.Value == 0)来代替? 按查找对Dictionary<,>是不寻常的; 如果您是通过键search,则可以使用TryGetValue

另一种方法是:

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

这将返回一个 – 所以如果没有find,它将是null

我build议你这样改变它:

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

然后你可以看到列表是否为空,如果不是,则取第一个值

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

请注意,字典中没有“第一个”条目的真正概念 – 迭代的顺序没有明确定义。 如果你想得到首先用这个值input的键/值对,你需要一个保存顺序的字典。

(这是假设你真的想知道关键 – 如果你只是在存在检查后,马克的解决scheme是最合适的。)

使用default()关键字。

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

你想要的是一个Any方法,以及给你的匹配元素。 你可以很容易地自己写这个方法。

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

你可以检查一下

 available.Key==Guid.Empty 

在不指定types的情况下检查结构(如KeyValuePair)的默认值的方法是使用Activator创build新实例:

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