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

时间:2014-07-31 21:20:27

标签: c# .net 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; }
}

我想知道是否有一种方法可以使用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;

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

提前致谢。

1 个答案:

答案 0 :(得分:4)

使用匿名对象按三个属性分组。然后将每个组投影到新的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()