我有五个变量,其中有个别数据,之后我将各自的电荷量连接到一个变量。这很好。
现在问题是假设我只有一个数据(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();
答案 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);