当T是结构时,List <t>如何工作?</t>

时间:2012-10-01 15:22:50

标签: c# .net list generics struct

我有List<KeyValuePair<string, othertype>>。我需要按照

的方式做点什么
list.Find(x=>x.Key=="foobar")

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

4 个答案:

答案 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,其中Keynull {默认为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