检查是否存在与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!"); }