Как я могу убедиться, что FirstOrDefault вернул значение
вот упрощенная версия того, что я пытаюсь сделать:
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 не возвращает допустимое значение. Я хочу иметь возможность проверить эту ситуацию, но я понимаю, что не могу сравнить результат с "null", потому что 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 вернул допустимое значение?
3 ответа:
Это самый ясный и лаконичный способ на мой взгляд:
var matchedDays = days.Where(x => sampleText.Contains(x.Value)); if (!matchedDays.Any()) { // Nothing matched } else { // Get the first match var day = matchedDays.First(); }
это полностью обходится с использованием странных значений по умолчанию для структур.
FirstOrDefault
не возвращает null, он возвращаетdefault(T)
.
Вы должны проверить:var defaultDay = default(KeyValuePair<int, string>); bool b = day.Equals(defaultDay);
С MSDN -
Enumerable.FirstOrDefault<TSource>
:по умолчанию( TSource) если источник является пустым; в противном случае первый элемент источник.
Примечания:
- если ваш код является общим, то лучше использовать
EqualityComparer<T>.Default.Equals(day, defaultDay)
, потому что.Equals
может быть изменен илиday
может бытьnull
.- В C# 7.1 вы сможете использовать
var defaultDay = default;
см. целевой типизированный литерал "по умолчанию".- Читайте также: Ссылка На Источник
FirstOrDefault
вы можете сделать это вместо:
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"); }