4

当方法属于所讨论的对象时,空条件运算符非常有用,但如果所讨论的对象是参数怎么办?例如,这可以缩短吗?

var someList = new List<SomeType>();
if (anotherList.Find(somePredicate) != null)
{
    someList.Add(anotherList.Find(somePredicate))
}

我想到的一种解决方案是使用如下扩展方法:

public static void AddTo<T>(this T item, List<T> list)
{
    list.Add(item);
}

这样,第一个代码块可以简化为:

var someList = new List<SomeType>();
anotherList.Find(somePredicate)?.AddTo(someList);

但是此解决方案特定于此示例(即,如果对象不为空,则将对象添加到列表中)。有没有一种通用的方法来指示如果参数为空,则不应该运行该方法?

4

3 回答 3

4

您也可以只使用:

var someList = new List<SomeType>();
someList.AddRange(anotherList.Where(somePredicate));

在您的情况下,您可能需要确保您的谓词最多只能找到一个元素。

于 2018-04-08T09:13:14.667 回答
4

永远不要这样做

var someList = new List<SomeType>();
if (anotherList.Find(somePredicate) != null)
{
    someList.Add(anotherList.Find(somePredicate))
}

这将搜索列表两次,这是不必要的。改用临时变量。

var someList = new List<SomeType>();
var find = anotherList.Find(somePredicate);
if (find != null) someList.Add(find);

有没有一种通用的方法来指示如果参数为空,则不应该运行该方法?

目前没有这样的功能。有没有其他替代方案可以像提供的其他答案一样工作得更好。

于 2018-04-08T09:21:01.853 回答
2

TLDR:还没有。

该团队计划在语言中实现一个功能,这将做这件事。它看起来像这样:

someList.Add(anotherList.Find(somePredicate) ?? return);

其中?? return检查第一个参数是否为空,如果是,则返回。(或者你可以写 break 如果这是你想要的)

我不确定这是否是他们目前正在做的事情,以及它是否会包含在 C# 的下一个版本中,但如果它会这样做,将会有很长的路要走。

于 2018-04-08T09:08:30.857 回答