我如何确保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