15

我有一个List<KeyValuePair<string, othertype>>. 我需要做一些事情

list.Find(x=>x.Key=="foobar")

但是,如果列表中不存在该行为,那么行为会是什么?通常它会返回 null,但结构不能为 null。

4

4 回答 4

18

我的建议是FindIndex用于不可为空的类型

int index = list.FindIndex(x => x.Key == "foobar");
if (index >= 0) {
    // found!
    UseResult(list[index]);
}

不成功default(T)则返回默认值。Find()对于不可为空的类型,此结果无法与具有默认值的常规条目区分开来。当列表可能包含常规null条目时,对于可空类型也是如此。

于 2012-10-01T15:32:14.450 回答
15

它将返回与default(T)相同的new KeyValuePair<string, othertype>>(),即默认初始化的结构。

基本上,引用类型的默认值是 always null,而对于值类型(包括struct),它是默认值(0对于数字、falsefor bool、a struct,每个字段都默认用于结构等)

因此,对于 adefault(KeyValuePair<string, othertype>>)你会得到一个 KVP ,其中Keynull(默认为string)和不管是什么default(othertype)(如上面的例子)......

MSDN

与指定谓词定义的条件匹配的第一个元素(如果找到);否则,类型 T 的默认值。

使用此方法,如果您想检查是否default找回yourResult.Key != null了.FindFindIndex

于 2012-10-01T15:26:04.833 回答
3

结构是一种值类型。因此,在结构查找的情况下,将返回结构的默认值。

例子:

假设我们的结构如下,

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    
 }
于 2012-10-01T15:32:44.093 回答
1

通过阅读这两篇文档文章,在我看来,您应该返回结构的默认值:

默认值: http: //msdn.microsoft.com/en-us/library/aa664475 (v=vs.71).aspx

List(T).Find 方法:http: //msdn.microsoft.com/en-us/library/x0b5b5bc.aspx

于 2012-10-01T15:27:49.037 回答