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();