LINQ如果数组为空则返回null

时间:2015-02-19 16:07:11

标签: c# linq linq-to-objects

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

3 个答案:

答案 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;
相关问题