Как я могу убедиться, что FirstOrDefault <KeyValuePair> вернул значение
Вот упрощенная версия того, что я пытаюсь сделать:
var days = new Dictionary<int, string>();
days.Add(1, "Monday");
days.Add(2, "Tuesday");
...
days.Add(7, "Sunday");
var sampleText = "My favorite day of the week is 'xyz'";
var day = days.FirstOrDefault(x => sampleText.Contains(x.Value));
Так как "xyz" отсутствует в переменной KeyValuePair, метод FirstOrDefault не вернет действительное значение. Я хочу проверить эту ситуацию, но понимаю, что я не могу сравнить результат с "нулевым", потому что KeyValuePair - это структура. Недопустимый следующий код:
if (day == null) {
System.Diagnotics.Debug.Write("Couldn't find day of week");
}
Мы пытаемся скомпилировать код, Visual Studio выдает следующую ошибку:
Operator '==' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<int,string>' and '<null>'
Как я могу проверить, что FirstOrDefault вернул действительное значение?
Ответы
Ответ 1
FirstOrDefault
не возвращает FirstOrDefault
, он возвращает default(T)
.
Вы должны проверить:
var defaultDay = default(KeyValuePair<int, string>);
bool b = day.Equals(defaultDay);
Из MSDN - Enumerable.FirstOrDefault<TSource>
:
по умолчанию (TSource), если источник пуст; в противном случае первый элемент в источнике.
Заметки:
Ответ 2
Это самый ясный и лаконичный способ, на мой взгляд:
var matchedDays = days.Where(x => sampleText.Contains(x.Value));
if (!matchedDays.Any())
{
// Nothing matched
}
else
{
// Get the first match
var day = matchedDays.First();
}
Это полностью обходится с использованием странных значений по умолчанию для структур.
Ответ 3
Вы можете сделать это вместо этого:
var days = new Dictionary<int?, string>(); // replace int by int?
days.Add(1, "Monday");
days.Add(2, "Tuesday");
...
days.Add(7, "Sunday");
var sampleText = "My favorite day of the week is 'xyz'";
var day = days.FirstOrDefault(x => sampleText.Contains(x.Value));
а потом:
if (day.Key == null) {
System.Diagnotics.Debug.Write("Couldn't find day of week");
}