我有一本类型的字典
Dictionary<Guid,int>
Run Code Online (Sandbox Code Playgroud)
我想返回使用条件的第一个实例
var available = m_AvailableDict.FirstOrDefault(p => p.Value == 0)
Run Code Online (Sandbox Code Playgroud)
但是,如何检查我是否真的回到了KeyValuePair?我似乎无法使用!=或==在没有编译器错误的情况下检查默认值(KeyValuePair).有一个类似的线程在这里并不十分似乎有一个解决方案.我实际上能够通过获取密钥并检查Guid的默认值来解决我的特定问题,但我很好奇是否有一个使用keyvaluepair执行此操作的好方法.谢谢
Mar*_*ell 104
如果你只关心存在,你可以使用ContainsValue(0)或Any(p => p.Value == 0)代替吗?按价值搜索对于a来说是不寻常的Dictionary<,>; 如果你是按键搜索,你可以使用TryGetValue.
另一种方法:
var record = data.Where(p => p.Value == 1)
.Select(p => new { Key = p.Key, Value = p.Value })
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
这会返回一个类 - null如果找不到则会返回.
Jon*_*eet 25
我建议你这样改变它:
var query = m_AvailableDict.Where(p => p.Value == 0).Take(1).ToList();
Run Code Online (Sandbox Code Playgroud)
然后,您可以查看列表是否为空,如果不是,则取第一个值,例如
if (query.Count == 0)
{
// Take action accordingly
}
else
{
Guid key = query[0].Key;
// Use the key
}
Run Code Online (Sandbox Code Playgroud)
请注意,字典中没有"第一"条目的真实概念 - 迭代的顺序没有明确定义.如果您想获得首次使用该值输入的键/值对,您将需要某种类型的订单保留字典.
(这假设您确实想知道密钥 - 如果您只是在存在检查之后,Marc的解决方案是最合适的.)
Flo*_*lkl 13
使用default()关键字.
bool exists = !available.Equals(default(KeyValuePair<Guid, int>));
Run Code Online (Sandbox Code Playgroud)
你想要的是一个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;
}
}
Run Code Online (Sandbox Code Playgroud)