如何动态使用Concat删除空列表

时间:2016-11-12 10:18:33

标签: c# json

我将相同类型的列表传递给json文件,但是如果json找到一个节点,它期望数据在其中,那么我有问题我在使用concat函数,但列表将并不总是对它们进行评估,所以我不需要能够动态地构建列表。

 List<Asset> AllAssets = allAssets.Concat(_vheiclesList)
                                .Concat(_propertyList)
                                .Concat(_securedLoansAssets)
                                .Concat(_allSavings)
                                .Concat(_allPensions)
                                .Concat(_allOtherAssets)
                                .ToList();

例如,如果没有属性或节省,则列表连接将如下所示。

List<Asset> AllAssets = allAssets.Concat(_vheiclesList)
                                .Concat(_securedLoansAssets)
                                .Concat(_allPensions)
                                .Concat(_allOtherAssets)
                                .ToList();

每个列表都是asset类型,然后我还需要能够告诉json删除这些,所以我需要一种方法通过if语句添加每个列表以检查{{1然后不要把它连接起来。

3 个答案:

答案 0 :(得分:1)

您可以使用扩展方法来处理列表的null值。 E.g。

    public static class EnumerableExtension
    {
        public static IEnumerable<TSource> ConcatOrDefault<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
        {
            if (second == null)
                return first;
            return first.Concat(second);
        }
    }

然后你可以将你的陈述重写为

List<Asset> AllAssets = allAssets.ConcatOrDefault(_vheiclesList)
                            .ConcatOrDefault(_propertyList)
                            .ConcatOrDefault(_securedLoansAssets)
                            .ConcatOrDefault(_allSavings)
                            .ConcatOrDefault(_allPensions)
                            .ConcatOrDefault(_allOtherAssets)
                            .ToList();

现在,_propertyList_allSavings等值可能为空。在这种情况下,只返回未改变的序列。

答案 1 :(得分:0)

你可以通过构造一个数组数组,然后过滤掉空数组(Where),然后将剩余的数组展平成一个数组(SelectMany)来实现。

List<Asset> AllAssets = new[]
    {
        allAssets,
        _vheiclesList,
        _propertyList,
        _securedLoanAssets,
        _allSavings,
        _allPensions,
        _allOtherAssets,
    }
    .Where(x => x != null)
    .SelectMany(x => x)
    .ToList();

答案 2 :(得分:0)

最小变化解决方案可能是使用空合并运算符:

List<Asset> AllAssets = allAssets
    .Concat(_vheiclesList ?? Enumerable.Empty<Asset>())
    .Concat(_propertyList ?? Enumerable.Empty<Asset>())
    .Concat(_securedLoansAssets ?? Enumerable.Empty<Asset>())
    .Concat(_allSavings ?? Enumerable.Empty<Asset>())
    .Concat(_allPensions ?? Enumerable.Empty<Asset>())
    .Concat(_allOtherAssets ?? Enumerable.Empty<Asset>())
    .ToList();