Как я могу убедиться, что 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 70

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) если источник является пустым; в противном случае первый элемент источник.

Примечания:

вы можете сделать это вместо:

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");
}