[c#] 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’가 없기 때문에 FirstOrDefault 메서드는 유효한 값을 반환하지 않습니다. 이 상황을 확인하고 싶지만 KeyValuePair가 구조이기 때문에 결과를 “null”과 비교할 수 없다는 것을 알고 있습니다. 다음 코드는 유효하지 않습니다.

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가 유효한 값을 반환했는지 어떻게 확인할 수 있습니까?



답변

FirstOrDefaultnull을 반환하지 않으면 default(T).
다음 사항을 확인해야합니다.

var defaultDay = default(KeyValuePair<int, string>);
bool b = day.Equals(defaultDay);

에서 MSDN –Enumerable.FirstOrDefault<TSource> :

source가 비어 있으면 default ( TSource ); 그렇지 않으면 source 의 첫 번째 요소입니다 .

노트:


답변

이것은 제 생각에 가장 명확하고 간결한 방법입니다.

var matchedDays = days.Where(x => sampleText.Contains(x.Value));
if (!matchedDays.Any())
{
    // Nothing matched
}
else
{
    // Get the first match
    var day = matchedDays.First();
}

이것은 구조체에 대해 이상한 기본값을 사용하여 완전히 돌아갑니다.


답변

대신 이렇게 할 수 있습니다.

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


답변