gpt4 book ai didi

c# - 在 Linq 中展平和分组复杂对象并保留空子项

转载 作者:行者123 更新时间:2023-11-30 12:38:50 25 4
gpt4 key购买 nike

我有一个名为 RouteExport 的复杂对象的列表,我试图根据 CustomerNumber 值将其展平和分组,以便它返回一个匿名对象,如下所示

{ CustomerNumber = "1235", Route = route1, Section = section2, Sequence = sequence2 } 

{ CustomerNumber = "1234", Route = route1, Section = null, Sequence = null }

模型看起来像这样:

public class RouteExport
{
public string Name { get; set; }
public string Term { get; set; }
public List<string> CustomerNumbers { get; set; }
public List<SectionExport> Sections { get; set; }
}

public class SectionExport
{
public string Name { get; set; }
public List<string> CustomerNumbers { get; set; }
public List<SequenceExport> Sequences { get; set; }
}

public class SequenceExport
{
public string Name { get; set; }
public List<string> CustomerNumbers { get; set; }
}

每个对象都有一个 CustomerNumber 列表,如果客户在该路线/路段/序列中,则该列表包含客户的号码。我想根据该客户编号对每个对象进行分组。到目前为止,我一直在使用这个:

var flattendExport = exportViewModel.ExportContainer.Routes
.SelectMany(rt => rt.Sections
.SelectMany(sec => sec.Sequences
.SelectMany(seq => seq.CustomerNumbers
.Select(custNum => new { rt, sec, seq, custNum })))).ToList();

展平对象但不按 CustomerNumber 分组,也不为部分或序列返回 null。

我如何进行查询以返回按每个对象的 CustomerNumbers 分组并返回 null(如果它们不在部分或序列中)的扁平化列表?

用测试用例更新

我没有充分表述原始问题,因此进行了一些修改。我想对客户的号码进行分组,以便此数据:

var data = new List<RouteExport>
{
new RouteExport
{
CustomerNumbers = new List<string> { "1", "2" },
Sections = new List<SectionExport>
{
new SectionExport()
{
CustomerNumbers = new List<string> { "1" },
Sequences = new List<SequenceExport> {
new SequenceExport()
{
CustomerNumbers = new List<string> { "1" }
}
}
}
}
}
};

返回以下结果:

{ CustomerNumber = "1", Route = route1, Section = section1, Sequence = sequence1},
{ CustomerNumber = "2", Route = route1, Section = null, Sequence = null}

最佳答案

Sections 集合为空时,您可以使用 LINQ 的 DefaultIfEmpty 插入您需要的空值。参见 https://msdn.microsoft.com/en-us/library/bb355419(v=vs.110).aspx

在第二个.SelectMany(...) 的末尾添加:

.DefaultIfEmpty(new { rt, null, null, cystNum })

“对于没有路段的每条路线,创建一个虚拟结果”。

编辑:鉴于您更改的要求,它看起来像这样:

 var res = data.SelectMany(r => r.CustomerNumbers
.SelectMany(c => r.Sections.Where(s => s.CustomerNumbers.Contains(c))
.SelectMany(s => s.Sequences
.Select(seq => new { CustomerNumber = c, Route = r, Section = s, Sequence = seq }))
.DefaultIfEmpty(new { CustomerNumber = c, Route = r, Section = (SectionExport)null, Sequence = (SequenceExport)null })))
.ToList();

关于c# - 在 Linq 中展平和分组复杂对象并保留空子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49542171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com