다음은 내가하려는 작업의 단순화 된 버전입니다.
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가 유효한 값을 반환했는지 어떻게 확인할 수 있습니까?
답변
FirstOrDefault
null을 반환하지 않으면 default(T)
.
다음 사항을 확인해야합니다.
var defaultDay = default(KeyValuePair<int, string>);
bool b = day.Equals(defaultDay);
에서 MSDN –Enumerable.FirstOrDefault<TSource>
:
source가 비어 있으면 default ( TSource ); 그렇지 않으면 source 의 첫 번째 요소입니다 .
노트:
- 당신의 코드가 사용이 더 일반적인 경우
EqualityComparer<T>.Default.Equals(day, defaultDay)
, becuase.Equals
오버라이드 (override) 할 수있다 또는day
될 수있다null
. - C # 7.1에서는을 사용할 수
KeyValuePair<int, string> defaultDay = default;
있습니다. 대상 유형 “기본”리터럴을 참조하십시오 . - 참조 : 참조 소스-
FirstOrDefault
답변
이것은 제 생각에 가장 명확하고 간결한 방법입니다.
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");
}