Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在检查函数结果时将其添加到列表_C# - Fatal编程技术网

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;
}