gpt4 book ai didi

c# - 使用 LINQ 的结构与类

转载 作者:行者123 更新时间:2023-11-30 21:41:23 24 4
gpt4 key购买 nike

当我发现一些我不完全理解的东西时,我正在编写一些代码,所以我创建了以下测试代码:

static void Main(string[] args)
{
string myKey = "bla";
var list = new List<KeyValuePair<string, string>>();
var list2 = new List<Test>();


var bla1 = (from a in list where a.Key == myKey select a.Value).FirstOrDefault();
var bla2 = list.FirstOrDefault(x => x.Key == myKey).Value;

var bla3 = (from a in list2 where a.Key == myKey select a.Value).FirstOrDefault();
var bla4 = list2.FirstOrDefault(x => x.Key == myKey).Value;

}

struct Test
{
public string Key { get; set; }
public string Value { get; set; }

public Test(string key, string value)
{
Key = key;
Value = value;
}
}

现在只要 Test 是一个结构,所有 4 个 bla 行都可以正常工作。但是一旦我将 Test 更改为 class 而不是 struct bla4 就会失败。怎么会这样?是不是 bla4 只是执行 bla3 的另一种(lambda)方式,因此应该表现相同?为什么列表包含 struct'sclasses 会有所不同?有没有办法让 bla4 的 lambda 版本不抛出异常,而是像其他版本一样返回 null?

最佳答案

类类型的默认值为空。结构的默认值是一个空结构。这就是为什么 FirstOrDefault(..).Value 会因 NullReferenceException 而失败。

在尝试访问结果之前,您应该检查 FirstOrDefault() 是否返回了一些东西。

var item = list2.FirstOrDefault(x => x.Key == myKey);
var bla4 = (item == null)?null:item.Value;

在 C# 6 及更高版本中,您可以使用 ?. 运算符来执行相同的检查:

var item = list2.FirstOrDefault(x => x.Key == myKey)?.Value;

另一种选择是使用 ?? 将 null 替换为默认值。

var item = list2.FirstOrDefault(x => x.Key == myKey) ?? new Test();
var bla4 = item.Value;

在这种情况下创建一个特殊的Empty对象是很常见的,例如:

class Test
{
//...
public static readonly Empty =new Test();
}

var item = list2.FirstOrDefault(x => x.Key == myKey) ?? Test.Empty;
var bla4 = item.Value;

关于c# - 使用 LINQ 的结构与类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43387998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com