我如何确保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'不存在于KeyValuePairvariables中,所以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是否返回了有效值?

我认为这是最清晰简明的方法:

 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; ,请参阅目标types的“默认”文字 。
  • 另请参阅: 参考源 – FirstOrDefault