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# 如果数组为空,LINQ将返回null_C#_Linq_Linq To Objects - Fatal编程技术网

C# 如果数组为空,LINQ将返回null

C# 如果数组为空,LINQ将返回null,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,我有一个IEnumerable,我想构建一个int[]集合中所有Stuff对象的x属性 我有: 在不存储tmp的情况下,是否可以执行此操作 编辑:主要问题是如何在不存储中间结果的情况下执行此操作。类似于T-SQL中的NULLIF(),如果条件为false,则返回传入的内容;如果条件为true,则返回NULL。仅当coll不为空时创建数组,因此反过来: var tmp = coll.Select(s => s.x).ToArray(); int[] data = tmp.Any() ? tm

我有一个
IEnumerable
,我想构建一个
int[]
集合中所有
Stuff
对象的
x
属性

我有:

在不存储
tmp
的情况下,是否可以执行此操作


编辑:主要问题是如何在不存储中间结果的情况下执行此操作。类似于
T-SQL中的
NULLIF()
,如果条件为false,则返回传入的内容;如果条件为true,则返回
NULL

仅当
coll
不为空时创建数组,因此反过来:

var tmp = coll.Select(s => s.x).ToArray();
int[] data = tmp.Any() ? tmp : null;

没有办法让
Select
返回null,但如果不想创建其他数组,可以执行以下操作:

int[] data = null;
if(coll.Any()) data = coll.Select(s => s.x).ToArray();

如果您经常这样做,您可以编写一个扩展方法:

var tmp = coll.Select(s => s.x);
int[] data = tmp.Any() ? tmp.ToArray() : null;

为什么要迭代两次结果,而不是OP当前的结果?
Any()
会立即返回,因为投影是空的,或者至少有一个元素,所以不会枚举整个集合两次。我非常喜欢这种方法。与我以前的解决方案不同,如果需要空安全性,还可以添加对
seq==null
的检查。@Sinatr不需要时,为什么要限制输入类型的范围?OP的输入有一个
IEnumerable
,因此回答OP时必须使用
IEnumerable
@Sinatr,这有什么好处?它使调用方在调用站点上使用
ToArray()
int[] data = null;
if(coll.Any()) data = coll.Select(s => s.x).ToArray();
var tmp = coll.Select(s => s.x);
int[] data = tmp.Any() ? tmp.ToArray() : null;
public static class IEnumerableExt
{
    public static T[] ToArrayOrNull<T>(this IEnumerable<T> seq)
    {
        var result = seq.ToArray();

        if (result.Length == 0)
            return null;

        return result;
    }
}
var data = coll.Select(s => s.x).ToArrayOrNull();