使用 linq 和 lambda 对列表进行分组和展平

Lea*_*res 3 .net c# linq lambda grouping

我有以下课程

public class SolicitacaoConhecimentoTransporte
{
    public long ID { get; set; }

    public string CodigoOriginal { get; set; }

    public DateTime Data { get; set; }

    public List<CaixaConhecimentoTransporte> Caixas { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种方法可以使用 Linq(使用 lambda 表达式语法)实现以下代码的相同行为,

List<SolicitacaoConhecimentoTransporte> auxList = new List<SolicitacaoConhecimentoTransporte>();

foreach (SolicitacaoConhecimentoTransporte s in listaSolicitacao)
{
    SolicitacaoConhecimentoTransporte existing =
                    auxList.FirstOrDefault(f => f.CodigoOriginal == s.CodigoOriginal &&
                                                f.Data == s.Data && 
                                                f.ID == s.ID);

    if (existing == null)
    {
        auxList.Add(s);
    }
    else
    {
        existing.Caixas.AddRange(s.Caixas);
    }
}

return auxList;
Run Code Online (Sandbox Code Playgroud)

换句话说,将所有具有相同属性的实体分组并将所有列表合并为一个。

提前致谢。

Ser*_*kiy 5

使用匿名对象按三个属性分组。然后将每个组投影到新SolicitacaoConhecimentoTransporte实例。用于从每个组中Enumerable.SelectMany获得展平的序列CaixaConhecimentoTransporte

listaSolicitacao.GroupBy(s => new { s.CodigoOriginal, s.Data, s.ID })
   .Select(g => new SolicitacaoConhecimentoTransporte {
         ID = g.Key.ID,
         Data = g.Key.Data,
         CodigoOriginal = g.Key.CodigoOriginal,
         Caixas = g.SelectMany(s => s.Caixas).ToList()
    }).ToList()
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 Sergey,我知道使用 SelectMany 方法来平铺列表,但我没有意识到匿名分组的“技巧”。 (2认同)