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
}