我经常这样做,所以我想知道是否存在一种巧妙的方法来跳过使用变量。我有一个函数,返回未知长度的列表。我想将结果添加到另一个列表,并且还知道是否返回了一个空列表。我可以将函数结果保存在变量中,然后查看其是否为空,否则将其添加到列表中。我只是在想是否可以更优雅地完成此操作。 我也可以:
myList.AddRange(getFiles(path));
if(getFiles(path).Count == 0)
{
doSomething();
}
getFiles是一个示例函数,它在路径中返回文件列表
但是那样,我必须调用该函数两次。
这更多是一个编程风格的问题,因为我没有经验。每次发生这种情况时,都应该制作一个“ tmp”变量吗?
答案 0 :(得分:4)
使用此扩展方法:
public static int AddRangeEx<T>(this List<T> target, IEnumerable<T> items)
{
int result = items.Count();
if( result > 0 ) target.AddRange(items);
return result;
}
然后您就可以编写如下代码:
if(myList.AddRangeEx(getfiles(path)) > 0)
{
doSomething();
}
或者,如果您担心额外的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()
和Count()
所做的实际上没有什么不同。
此外,您可以重载扩展方法,以提高已经知道计数的类型的性能:
public static int AddRangeEx<T>(this List<T> target, T[] items)
{
if (items.Length > 0)
target.AddRange(items);
return items.Length;
}
这让我很难过,内置的AddRange()
方法尚未为我们做到这一点。
答案 1 :(得分:2)
首选是只存储局部变量
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();
}