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



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



Dictionary<Guid,int>


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



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


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

635   6  

6 ответов:

если вы просто заботитесь о существовании, вы могли бы использовать 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();

это возвращает a класс - так будет null если не нашли.

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

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
}
первый введенный с этим значением, вам понадобится какой-то словарь для сохранения порядка.

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

используйте ключевое слово 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

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

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

Comments

    Ничего не найдено.