这是我正在尝试做的简化版本:
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));
Run Code Online (Sandbox Code Playgroud)
由于KeyValuePair变量中不存在'xyz',因此FirstOrDefault方法不会返回有效值.我希望能够检查这种情况,但我意识到我无法将结果与"null"进行比较,因为KeyValuePair是一个结构.以下代码无效:
if (day == null) {
System.Diagnotics.Debug.Write("Couldn't find day of week");
}
Run Code Online (Sandbox Code Playgroud)
我们尝试编译代码,Visual Studio会抛出以下错误:
Operator '==' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<int,string>' and '<null>'
Run Code Online (Sandbox Code Playgroud)
如何检查FirstOrDefault是否返回了有效值?
Kob*_*obi 144
FirstOrDefault不返回null,它返回default(T).
你应该检查:
var defaultDay = default(KeyValuePair<int, string>);
bool b = day.Equals(defaultDay);
Run Code Online (Sandbox Code Playgroud)
来自MSDN -Enumerable.FirstOrDefault<TSource>:
如果source为空,则为default(TSource); 否则,源中的第一个元素.
笔记:
EqualityComparer<T>.Default.Equals(day, defaultDay),因为.Equals可能会被覆盖或者day可能是null.var defaultDay = default;,请参阅Target-typed"default"文字.FirstOrDefaultpea*_*ide 51
在我看来,这是最简洁明了的方式:
var matchedDays = days.Where(x => sampleText.Contains(x.Value));
if (!matchedDays.Any())
{
// Nothing matched
}
else
{
// Get the first match
var day = matchedDays.First();
}
Run Code Online (Sandbox Code Playgroud)
这完全绕过结构使用奇怪的默认值.