Concat列表空检查

时间:2016-04-19 07:44:11

标签: c# linq

我有五个变量,其中有个别数据,之后我将各自的电荷量连接到一个变量。这很好。

现在问题是假设我只有一个数据(var CCPcv有数据)而其余数据没有数据,var CombinedPcv换行,因为其他变量的充电量为空。可以有n个场景(2个有数据,3个有数据等)。

一种方法是我检查每个变量的空值,然后对变量组合进行空检查。

请建议更好的方法。

var CCPcv = (GuidedPcvYear1CCViewModel)wizard.Steps[est bettgwizard.OrderedSteps[typeof(GuidedPcvYear1CCViewModel)]];
var CPCPcv = (GuidedPcvYear1CPCViewModel)wizard.Steps[wizard.OrderedSteps[typeof(GuidedPcvYear1CPCViewModel)]];
var VpayPcv = (GuidedPcvYear1VPAViewModel)wizard.Steps[wizard.OrderedSteps[typeof(GuidedPcvYear1VPAViewModel)]];
var BIPPcv = (GuidedPcvYear1BIPViewModel)wizard.Steps[wizard.OrderedSteps[typeof(GuidedPcvYear1BIPViewModel)]];
var GnicsCCPcv = (GuidedPcvYear1CCGnicsViewModel)wizard.Steps[wizard.OrderedSteps[typeof(GuidedPcvYear1CCGnicsViewModel)]];

var CombinedCV = CCPcv.ChargeVolumes.ConvertAll(cv=>cv).Concat(CPCPcv.ChargeVolumes.ConvertAll(x=>x).Concat(VpayPcv.ChargeVolumes.ConvertAll(z=>z).Concat(BIPPcv.ChargeVolumes.ConvertAll(a=>a).Concat(GnicsCCPcv.ChargeVolumes.ConvertAll(s=>s)))));
year1ChargeVolumes = CombinedCV.ToList();

4 个答案:

答案 0 :(得分:0)

以下是扩展方法的示例:

static class MyConcatExtension
{
    public static IEnumerable<T> ConcatNotNulls<T>(this IEnumerable<T> collection1, IEnumerable<T> collection2)
    {
        // collection is null, you might want to check collection1 as well
        if (collection2 == null)
        {
            return collection1;
        }

        // collection of reference types has null items 
        if (!typeof(T).IsValueType)
        {
            return collection1.Concat(collection2.Where(item => item != null));

        }

        // collection of value types
        return collection1.Concat(collection2);
    }
}

你可以像以下一样使用它:

list1.ConcatNotNulls(list2);

答案 1 :(得分:0)

嗯,一种方法是确保您永远不会有null个枚举 - 只要您需要一个空的枚举,就可以使用Enumerable.Empty代替null

如果这不可行,您可以创建一个简单的扩展方法,将null枚举转换为空的可枚举:

 public static IEnumerable<T> NotNull<T>(this T @this)
   => Enumerable.Empty<T>();

此外,无需嵌套Concat。你可以这样做:

var combined =
  CCPcv?.ChargeVolumes?.NotNull()
  .Concat(CPCPcv?.ChargeVolumes?.NotNull())
  .Concat(VpayPcv?.ChargeVolumes?.NotNull())
  .Concat(BIPPcv?.ChargeVolumes?.NotNull())
  .Concat(GnicsCCPcv?.ChargeVolumes?.NotNull());

最后,听起来您的对象应该真正共享一个共同的界面。如果是这种情况,您可以编写另一个辅助方法,在多个枚举上应用相同的操作:

public static IEnumerable<ICV> DoStuff(params ICV[] cvs)
  => cvs.SelectMany(i => i?.ChargeVolumes?.NotNull());

答案 2 :(得分:0)

您可以按照以下方式执行此操作:

        var tempList = new List<GuidedPcvYear1CCViewModel>() { CCPcv ,CPCPcv,VpayPcv,BIPPcv,GnicsCCPcv};
        var CombinedCv = tempList.Where(i => i != null).ToList();

您只需在添加到列表之前转换它们。

答案 3 :(得分:0)

您可以编写一个这样的辅助方法:

public static IEnumerable<T> ConcatTreatingNullsAsEmpty<T>(params IEnumerable<T>[] sequences)
{
    return 
        from sequence in sequences where sequence != null
        from item in sequence
        select item;
}

然后按如下方式使用:

IEnumerable<int> seq1 = Enumerable.Range(1, 5);
IEnumerable<int> seq2 = null;
IEnumerable<int> seq3 = Enumerable.Range(6, 5);
IEnumerable<int> seq4 = null;
IEnumerable<int> seq5 = Enumerable.Range(11, 5);

var numbers = ConcatTreatingNullsAsEmpty(seq1, seq2, seq3, seq4, seq5);

Console.WriteLine(string.Join(", ", numbers)); // Prints 1, 2, ..., 14, 15

我认为你的代码看起来像这样:

var CombinedCV = ConcatTreatingNullsAsEmpty(
    CCPcv      .ChargeVolumes, 
    CPCPcv     .ChargeVolumes,
    VpayPcv    .ChargeVolumes,
    BIPPcv     .ChargeVolumes,
    GnicsCCPcv .ChargeVolumes);
相关问题