Проверьте, существует ли KeyValuePair с LINQ FirstOrDefault

У меня есть словарь типа

Dictionary<Guid,int>

Я хочу вернуть первый экземпляр, где выполняется условие с помощью

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

Однако, как я могу проверить, действительно ли я возвращаю KeyValuePair? Я не могу использовать!= Или == для проверки по умолчанию (KeyValuePair) без ошибки компилятора. Существует аналогичная тема здесь, которая, похоже, не имеет решения. Я действительно могу решить свою конкретную проблему, получив ключ и проверив умолчание Guid, но мне любопытно, есть ли хороший способ сделать это с помощью keyvaluepair. Благодаря

Ответ 1

Если вы просто заботитесь о существовании, вы можете использовать ContainsValue(0) или Any(p => p.Value == 0) вместо этого? Поиск по значению необычен для Dictionary<,>; если вы искали ключ, вы можете использовать TryGetValue.

Еще один подход:

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

Это возвращает класс - так будет null, если не найден.

Ответ 2

Я предлагаю вам изменить его следующим образом:

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
}

Обратите внимание, что нет реального понятия "первой" записи в словаре - порядок, в котором он повторяется, не определен. Если вы хотите получить пару ключ/значение, которая была впервые введена с этим значением, вам понадобится какой-либо словарь, сохраняющий порядок.

(Предполагается, что вы действительно хотите знать ключ - если вы только после проверки существования, Marc solution является наиболее подходящим.)

Ответ 3

Используйте ключевое слово default().

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

Ответ 4

То, что вы хотите, это метод 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;
  }
}

Ответ 5

вы можете проверить,

available.Key==Guid.Empty

Ответ 6

Способ проверки значения по умолчанию для структуры, такого как KeyValuePair без указания типа, заключается в создании нового экземпляра с помощью Activator:

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