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

Да, это ограничение GitLab. Существует открытая проблема с запросом этой функции:
https://gitlab.com/gitlab-org/gitlab-ce/issues/50459

Надеюсь, это будет в конечном итоге будут реализованы.

71
задан Community 23 May 2017 в 10:31
поделиться

5 ответов

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

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

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

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

104
ответ дан 24 November 2019 в 12:58
поделиться

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

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 '

25
ответ дан 24 November 2019 в 12:58
поделиться

Вам нужен метод 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;
  }
}
9
ответ дан 24 November 2019 в 12:58
поделиться

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

available.Key==Guid.Empty
2
ответ дан 24 November 2019 в 12:58
поделиться

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

bool exists = !available.Equals(default(KeyValuePair<Guid, int>));
13
ответ дан 24 November 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: