在检查时将功能结果添加到列表

时间:2018-11-05 22:51:54

标签: c#

我经常这样做,所以我想知道是否存在一种巧妙的方法来跳过使用变量。我有一个函数,返回未知长度的列表。我想将结果添加到另一个列表,并且还知道是否返回了一个空列表。我可以将函数结果保存在变量中,然后查看其是否为空,否则将其添加到列表中。我只是在想是否可以更优雅地完成此操作。 我也可以:

myList.AddRange(getFiles(path));
if(getFiles(path).Count == 0)
{
doSomething();
}

getFiles是一个示例函数,它在路径中返回文件列表

但是那样,我必须调用该函数两次。

这更多是一个编程风格的问题,因为我没有经验。每次发生这种情况时,都应该制作一个“ tmp”变量吗?

2 个答案:

答案 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();
}