Dav*_*lle 7 c# linq linq-to-objects
public class Stuff
{
public int x;
// ... other stuff
}
Run Code Online (Sandbox Code Playgroud)
我有一个IEnumerable<Stuff>和我想建立一个int[]所有的x所有的属性Stuff集合中的对象.
我做:
IEnumerable<Stuff> coll;
// ...
var data = coll.Select(s => s.x).ToArray();
Run Code Online (Sandbox Code Playgroud)
我想要的是一个空数组,而不是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;
Run Code Online (Sandbox Code Playgroud)
没有存储的任何方式tmp吗?
编辑:主要问题是如何在不存储中间结果的情况下执行此操作.喜欢的东西NULLIF()从T-SQL那里你回到你所传递的,如果条件是假的,NULL如果条件为真.
Mat*_*son 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;
}
}
Run Code Online (Sandbox Code Playgroud)
那么你的调用代码将是:
var data = coll.Select(s => s.x).ToArrayOrNull();
Run Code Online (Sandbox Code Playgroud)