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