Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表如何<;T>;。当T是一个结构时找到工作?_C#_.net_List_Generics_Struct - Fatal编程技术网

C# 列表如何<;T>;。当T是一个结构时找到工作?

C# 列表如何<;T>;。当T是一个结构时找到工作?,c#,.net,list,generics,struct,C#,.net,List,Generics,Struct,我有一个列表。我需要做一些类似的事情 list.Find(x=>x.Key=="foobar") 但是,如果列表中不存在这种情况,行为会是什么?通常它会返回null,但structs不能为null 它将返回默认值(T),该值与新KeyValuePair>()相同,即默认初始化结构 基本上,引用类型的默认值总是null,而对于值类型(包括struct),它是默认值(0表示数值,false表示bool,一个struct表示每个字段都默认为结构,等等) 因此,对于默认值(KeyValuePai

我有一个
列表
。我需要做一些类似的事情

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

但是,如果列表中不存在这种情况,行为会是什么?通常它会返回null,但structs不能为null

它将返回
默认值(T)
,该值与
新KeyValuePair>()
相同,即默认初始化结构

基本上,引用类型的默认值总是
null
,而对于值类型(包括
struct
),它是默认值(
0
表示数值,
false
表示
bool
,一个
struct
表示每个字段都默认为结构,等等)

因此,对于
默认值(KeyValuePair>)
您将得到一个KVP,其中
null
(字符串
的默认值)以及任何
默认值(其他类型)
(如上面的示例所示)

从:

与指定的 谓词,如果找到;否则,类型T的默认值为


使用此选项,如果您想检查并查看是否恢复了
默认值
,我建议您检查
yourResult.Key!=null
以查看是否得到结果,或者您可以按照Olivier的建议使用不同的
Find
方法,如
FindIndex

阅读这两篇文档文章,我觉得您应该返回结构的默认值:

默认值:

列表(T)。查找方法:

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

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

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

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

示例:

假设我们的结构如下所示

public struct Test
{
   public int i;
}

List<Test> list = new List<test>() { new Test { i = 1 } };
Test result = list.Find(o => o.i == 2);

if (resul.Equals(default(Test)))
{

        //Do something
 }
 else
 {
                  //Do something    
 }

尝试用<代码> int >代码>看看发生了什么。T类型的默认值,更具体地说是代码>默认(t)< /代码>。如果你想在没有匹配的情况下找到返回空值,考虑使用元组而不是KealValuePal.@ JamieSee不能使用元组,因为我们的目标是.NET 2相容性HEH,如果条件看起来如此…错。这对引用类型永远不起作用:)结构肯定不是我每天都使用的东西,尽管我建议不要做
==new Test()
,这有点重,因为
结构上的
==
是反射的。相反,我建议在
OP
示例中检查
Key
字段的
null
。是的,我们可以检查Key字段的null。但我认为如果键类型是int,那么int的默认值是0。所以,如果我们不想使用数据类型,那么使用new Test()检查将是有用的。即使在这种情况下,我也会检查default(Test)而不是==new Test(),目的更清楚。好的。感谢@JamesMichaelHare在阅读了关于默认(T)的内容后,默认(Test)看起来比新的Test好()+1:这是更好的解决方案。在这种情况下,具有null键的键值对不太可能是合法值,但这是可能的。太多的人忘记了这一点,或者忘记了那一点,例如,
列表
可以包含空值。我不想与违约进行比较;正如您所说,在大多数情况下,无法确定差异。可能值得注意的是,对于特定的值类型
Nullable
,因为默认初始化会导致
HasValue
为false(任何结构的任何布尔字段都是如此),它导致结构在许多上下文中被解释为空值。
if (resul.Equals(default(Test)))
{

        //Do something
 }
 else
 {
                  //Do something    
 }