如何用这个语句简化我的代码

问题描述 投票:0回答:4

最近完成一个功能代码,需要判断列表是否包含多个元素,如果列表只有一个元素,则返回。 如果列表为 null 或包含多个,则返回 null, 我这样完成代码。

return list.count == 1 ? list.SingleOrDefault() : null

但是我的老板认为这段代码可以简化,比如:

return  list.SingleOrDefault()
我想知道 C# 是否存在这样的函数。我花了很多时间。 也许我需要花钱打电话给chatgpt:(

return list.count == 1 ? list.SingleOrDefault() : null

谁能帮帮我?

c#
4个回答
3
投票

在 C# 11 中,您可以使用 List 模式

return list is [var x] ? x : default;

这测试列表(或数组)是否

  1. 不为空(隐含地)并且
  2. 只包含一个元素并且
  3. 如果是则声明一个变量
    x
  4. 使用
    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 =

0
投票

我真的不认为你的老板是对的。

SingleOrDefault
的工作原理如下:

  • 如果列表中没有元素,则返回默认值(引用类型为
    null
    ,值类型为0,
    false
    bool
    );
  • 如果有一个元素,则返回它。
  • 如果元素不止一个,则抛出异常

因此,如果您只使用

return list.SingleOrDefault()
,则需要使用
try
/
catch
(以防有多个元素)。是简化吗?!


0
投票

我的建议是:

return list.count == 1 ? list[0] : null;

因为 SingleOrDefault 函数会检查您已经检查过的条件。所以最好的方法是不要使用 SingleOrDefault 函数。 最好不要使用 try/catch,因为抛出错误会使您的代码不安全,并且由于错误是软件中断,它们会减慢您的程序。


0
投票

如果例如你有一个字符串列表并且只使用 list.SingleOrDefault() 它将返回它包含的唯一元素或 null,你是老板是正确的。 如果它有多个元素,尽管它会抛出异常 System.InvalidOperationException

如果您想知道它是否包含特定元素,您可以执行 list.Contains(myObject)

如果您真的想使用 list.count == 1 我宁愿根本不使用 list.SingeOrDefault 而是执行以下操作。 返回 list.count == 1 ?列表[0]:空;

我不确定我是否回答了你的问题,如果你还有什么想知道的,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.