Проверьте, существует ли KeyValuePair с FirstOrDefault LINQ
у меня есть словарь типа
Dictionary<Guid,int>
Я хочу вернуть первый экземпляр, где условие выполняется с помощью
var available = m_AvailableDict.FirstOrDefault(p => p.Value == 0)
однако, как я могу проверить, действительно ли я возвращаю KeyValuePair? Кажется, я не могу использовать != или == для проверки по умолчанию (KeyValuePair) без ошибки компилятора. Здесь есть похожая тема, которая, похоже, не имеет решения. Я действительно могу решить свою конкретную проблему, получив ключ и проверив значение по умолчанию Guid, но мне любопытно, есть ли хороший способ сделать это с помощью keyvaluepair. Спасибо
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; } }
чтобы проверить значение по умолчанию для структуры, такой как KeyValuePair без указания типа, необходимо создать новый экземпляр с помощью Activator:
if (available.Equals(Activator.CreateInstance(available.GetType()))) { Console.WriteLine("Not Found!"); }
Comments