LINQ如果数组为空则返回null

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)