我有List<KeyValuePair<string, othertype>>
。我需要按照
list.Find(x=>x.Key=="foobar")
但是,如果列表中不存在,那么行为是什么?通常它会返回null,但结构不能为null。
答案 0 :(得分:15)
我的建议是将FindIndex
用于非可空类型
int index = list.FindIndex(x => x.Key == "foobar");
if (index >= 0) {
// found!
UseResult(list[index]);
}
如果default(T)
不成功,则会返回默认值Find()
。对于非可空类型,此结果无法与具有默认值的常规条目区分开。当列表可能包含常规null
条目时,对于可空类型也是如此。
答案 1 :(得分:14)
它将返回default(T)
,它将与new KeyValuePair<string, othertype>>()
相同,即默认的初始化结构。
基本上,引用类型的默认值始终为null
,对于值类型(包括struct
),它是默认值(0
表示数字,false
表示bool
1}},struct
,每个字段默认为结构等。)
因此,对于default(KeyValuePair<string, othertype>>)
,你会收到一个KVP,其中Key
为null
{默认为string
),而default(othertype)
则为default
是(如上例所示)......
来自MSDN:
匹配指定条件定义的条件的第一个元素 谓词,如果找到;否则,类型T的默认值。
使用此功能,如果您想检查并查看是否取回yourResult.Key != null
,我建议您检查Find
以查看是否有结果,或者您可以使用其他{ {1}}方法,如Olivier所建议的FindIndex
。
答案 2 :(得分:3)
结构是一种价值类型。所以,在结构的情况下,Find将返回结构的默认值。
示例:强>
让我们说我们的结构如下,
public struct Test
{
public int i;
}
List<Test> list = new List<test>() { new Test { i = 1 } };
Test result = list.Find(o => o.i == 2);
在上面查找结果值,如新的Test()。您可以通过以下代码比较价值。
if (resul.Equals(new Test()))
{
//Do something
}
else
{
//Do something
}
或
if (resul.Equals(default(Test)))
{
//Do something
}
else
{
//Do something
}
答案 3 :(得分:1)
通过阅读这两篇文档文章,听起来好像应该返回结构的默认值:
默认值: http://msdn.microsoft.com/en-us/library/aa664475(v=vs.71).aspx
列表(T).Find方法: http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx