当方法属于相关对象时,空条件运算符非常有用,但如果有问题的对象是参数怎么办?例如,这可以缩短吗?
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);
但是此解决方案特定于此示例(即,如果对象不为null,则将对象添加到列表中)。是否有一般方法表明如果参数为null,则不应运行该方法?
答案 0 :(得分:4)
您也可以使用:
var someList = new List<SomeType>();
someList.AddRange(anotherList.Where(somePredicate));
在你的情况下,你可能需要确保你的谓词只找到最多一个元素。
答案 1 :(得分: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);
是否有一般方法表明如果参数为null,则不应运行该方法?
目前没有这样的功能。如何有其他替代方案像其他答案一样更好地工作。
答案 2 :(得分:2)
TLDR:还没有。
该团队计划在该语言中实现一项功能,即可完成这项工作。它看起来像这样:
someList.Add(anotherList.Find(somePredicate) ?? return);
?? return
检查第一个参数是否为null,如果是,则返回。 (或者,如果这是你想要的话,你可以写下来)
我不确定这是否是他们目前正在处理的事情,如果它将被包含在下一版本的C#中,但是如果它将会有很长的路要走。