public class Stuff
{
public int x;
// ... other stuff
}
我有IEnumerable<Stuff>
,我想构建集合中所有int[]
个对象的所有x
属性的Stuff
。
我做:
IEnumerable<Stuff> coll;
// ...
var data = coll.Select(s => s.x).ToArray();
如果集合为空,我想要的是空数组而不是int[0]
。换句话说,如果是!coll.Any()
,那么我想要data = null
。 (我的实际需要是coll
是复杂LINQ表达式的中间结果,我想在表达式链上使用LINQ操作,而不是保存中间结果)
我知道在许多情况下int[0]
比null
更合适,但我存储了许多这些结果,并且宁愿传递nulls
而不是空数组。
所以我目前的解决方案是这样的:
var tmp = coll.Select(s => s.x).ToArray();
int[] data = tmp.Any() ? tmp : null;
如果不存储tmp
,
编辑:主要问题是如何在不存储中间结果的情况下执行此操作。类似于NULLIF()
的{{1}},如果条件为假,则返回传入的内容;如果条件为真,则返回T-SQL
。
答案 0 :(得分:11)
如果您经常这样做,可以编写一个扩展方法:
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();
答案 1 :(得分:3)
仅当coll
不为空时才创建数组,反之亦然:
int[] data = null;
if(coll.Any()) data = coll.Select(s => s.x).ToArray();
答案 2 :(得分:1)
没有办法让Select
返回null,但是如果你不想创建一个额外的数组,你可以这样做:
var tmp = coll.Select(s => s.x);
int[] data = tmp.Any() ? tmp.ToArray() : null;