最近完成一个功能代码,需要判断列表是否包含多个元素,如果列表只有一个元素,则返回。 如果列表为 null 或包含多个,则返回 null, 我这样完成代码。
return list.count == 1 ? list.SingleOrDefault() : null
但是我的老板认为这段代码可以简化,比如:
return list.SingleOrDefault()
我想知道 C# 是否存在这样的函数。我花了很多时间。
也许我需要花钱打电话给chatgpt:(
return list.count == 1 ? list.SingleOrDefault() : null
谁能帮帮我?
在 C# 11 中,您可以使用 List 模式:
return list is [var x] ? x : default;
这测试列表(或数组)是否
x
和var模式为
x
这个元素赋值。这就是模式匹配如此强大的原因。它用简单的模式
[var x]
. 做了四件事(如果你算上索引列表是五件)
或者,可以使用 switch 表达式:
return list switch { [var x] => x, _ => default };
请注意,如果有多个元素,SingleOrDefault 会抛出异常。您的代码也缺少
null
列表的测试(除非您的意思是 “列表为空” 的零计数)。
测试:
List<string> list = null;
WriteTest();
list = new List<string>();
WriteTest();
list.Add("hello");
WriteTest();
list.Add("world");
WriteTest();
void WriteTest()
{
Console.WriteLine($"result = {(list is [var x] ? x : default)}");
}
打印:
result =
result =
result = hello
result =
我真的不认为你的老板是对的。
SingleOrDefault
的工作原理如下:
null
,值类型为0,false
为bool
);因此,如果您只使用
return list.SingleOrDefault()
,则需要使用 try
/catch
(以防有多个元素)。是简化吗?!
我的建议是:
return list.count == 1 ? list[0] : null;
因为 SingleOrDefault 函数会检查您已经检查过的条件。所以最好的方法是不要使用 SingleOrDefault 函数。 最好不要使用 try/catch,因为抛出错误会使您的代码不安全,并且由于错误是软件中断,它们会减慢您的程序。
如果例如你有一个字符串列表并且只使用 list.SingleOrDefault() 它将返回它包含的唯一元素或 null,你是老板是正确的。 如果它有多个元素,尽管它会抛出异常 System.InvalidOperationException
如果您想知道它是否包含特定元素,您可以执行 list.Contains(myObject)
如果您真的想使用 list.count == 1 我宁愿根本不使用 list.SingeOrDefault 而是执行以下操作。 返回 list.count == 1 ?列表[0]:空;
我不确定我是否回答了你的问题,如果你还有什么想知道的,请告诉我。