检查KeyQaluePair是否与LINQ的FirstOrDefault一起存在

Ste*_*eve 71 c# linq null

我有一本类型的字典

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如果找不到则会返回.

  • 这是使用匿名类型伪装成结构的巧妙技巧.我必须记住这一点. (6认同)

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)


Sam*_*uel 9

你想要的是一个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)