Проверьте, существует ли 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!");
}