2009-08-26 97 views
66

这里是什么,我试图做一个简化版本:我怎样才能确保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”是不存在的KeyValuePair变量中, FirstOrDefault方法不会返回有效的值。我希望能够检查这种情况,但我意识到我无法将结果与“null”进行比较,因为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已返回一个有效的价值?

+1

你有一个错误,但我认为这是一个复制粘贴的东西:天是不是一个列表,你不能使用KeyValuePair的添加。 – Kobi 2009-08-26 16:46:03

+0

ooops ...你是对的我从记忆中打字,我明显犯了一个错误。感谢您指出。 – desautelsj 2009-08-30 04:39:01

+0

这可能是:var days = new字典(); – 2010-08-03 18:35:31

回答

42

这是我认为最简洁明了的方式:

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

这完全得到周围用怪异的默认值工具和结构。

+12

问题在于,有可能(取决于具体实现)枚举日将被枚举两次,甚至更糟糕的是返回Any()和First()调用之间的不同值 – 2012-09-07 14:51:51

+0

@RayBooysen一个调用ToArray或ToList解决了这个问题,你可以使用Count/Length和Indexer。 – Console 2014-02-28 13:00:11

119

FirstOrDefault不返回空值,它返回default(T)
您应该检查:

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

MSDN - Enumerable.FirstOrDefault<TSource>

default(TSource) if source is empty; otherwise, the first element in source.

注:

+11

+1,KeyValuePair是一个值类型(结构),而不是引用类型(类)或可为null的值类型,因此它不能为空。 – Lucas 2009-08-26 17:06:23

+0

谢谢,它真的工作! – desautelsj 2009-08-26 19:18:15

+0

缺少typeof运算符,但对于好东西仍然为+1 – 2009-09-30 20:51:10

1

你可以这样做,而不是:

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