C# 在检查函数结果时将其添加到列表
当我经常这样做时,我想知道是否有一种巧妙的方法可以跳过使用变量。我有一个返回未知长度列表的函数。我想将结果添加到另一个列表中,并知道是否返回了一个空列表。我可以将函数结果保存在一个变量中,查看它是否为空,然后将其添加到列表中。我只是在想这是否可以做得更优雅一些。 我还可以做:C# 在检查函数结果时将其添加到列表,c#,C#,当我经常这样做时,我想知道是否有一种巧妙的方法可以跳过使用变量。我有一个返回未知长度列表的函数。我想将结果添加到另一个列表中,并知道是否返回了一个空列表。我可以将函数结果保存在一个变量中,查看它是否为空,然后将其添加到列表中。我只是在想这是否可以做得更优雅一些。 我还可以做: myList.AddRange(getFiles(path)); if(getFiles(path).Count == 0) { doSomething(); } getFiles是返回路径中文件列表的示例函数 但是,这
myList.AddRange(getFiles(path));
if(getFiles(path).Count == 0)
{
doSomething();
}
getFiles是返回路径中文件列表的示例函数
但是,这样我必须调用函数两次
这更像是一个编程风格的问题,因为我没有经验。是否应该在每次发生这种情况时都创建一个“tmp”变量?第一个选择是只存储一个局部变量
var files = getFiles(path);
myList.AddRange(files);
if(files.Count == 0)
{
doSomething();
}
第二个选择是这样
var count = myList.Count
myList.AddRange(getFiles(path));
if(myList.Count > count)
{
doSomething();
}
使此扩展方法:
public static int AddRangeEx<T>(this List<T> target, IEnumerable<T> items)
{
int result = items.Count();
if( result > 0 ) target.AddRange(items);
return result;
}
或者,如果您担心额外的Count()
调用的副作用(即使只是性能副作用,但有很多方法可以获得只能运行一次的IEnumerable),您可以这样构建扩展方法:
public static int AddRangeEx<T>(this List<T> target, IEnumerable<T> items)
{
int result = 0;
foreach (T item in items)
{
target.Add(item);
result++;
}
return result;
}
这让我有点难过,内置的
AddRange()
方法还没有为我们做到这一点。您查看过列表
和ExpandoObject
s吗?为什么不将其存储在变量中?不管怎样,你的榜样是坏习惯。。俗话说“查询一次,使用多次”,即只运行一次方法,如果您需要它返回的内容,请将其存储在局部变量中并使用它。如果您构建了一个大型系统并最终维护了它,那么您将因“跳过使用变量”而自责。如果其他人最终维护了它,他们将永远默默地诅咒你。变量的名称非常适合记录正在发生的事情(比注释好得多)。它们还使调试变得更容易。更糟糕的是,它们向堆栈帧添加了4或8个字节(即几乎没有),但是,如果它们确实是可跳过的,那么JIT将在您的生产代码中消除它们,因此它们不需要任何成本(除了一些键入)。在我看来,这应该是一个if/
else`块,并且AddRange()
调用应该仅在Count!=0这将更清楚地传达行为,并且使用空集合调用AddRange确实会有少量开销。
public static int AddRangeEx<T>(this List<T> target, IEnumerable<T> items)
{
int result = 0;
foreach (T item in items)
{
target.Add(item);
result++;
}
return result;
}
public static int AddRangeEx<T>(this List<T> target, T[] items)
{
if (items.Length > 0)
target.AddRange(items);
return items.Length;
}