按LINQ将组嵌套到树视图

本文关键字:视图 嵌套 LINQ | 更新日期: 2023-09-27 18:20:59

我有一个以下格式的列表:

List<Amortizacion> lista = new List<Amortizacion>
        {
            new Amortizacion {Fecha=Convert.ToDateTime("20/01/2012"), Idbanco=1, Nbanco="Bancomer", Idgrupo=1, Ngrupo="Jorge", Npersona="Jorge", Monto=500m},
            new Amortizacion {Fecha=Convert.ToDateTime("20/01/2012"), Idbanco=2, Nbanco="Afirme", Idgrupo=2, Ngrupo="CreaB", Npersona="Noe", Monto=200m},
            new Amortizacion {Fecha=Convert.ToDateTime("20/01/2012"), Idbanco=2, Nbanco="Afirme", Idgrupo=2, Ngrupo="CreaB", Npersona="Julio", Monto=250m},
            new Amortizacion {Fecha=Convert.ToDateTime("20/01/2012"), Idbanco=2, Nbanco="Afirme", Idgrupo=2, Ngrupo="CreaB", Npersona="Marcela", Monto=300m},
            new Amortizacion {Fecha=Convert.ToDateTime("21/01/2012"), Idbanco=1, Nbanco="Bancomer", Idgrupo=3, Ngrupo="Pedro", Npersona="Pedro", Monto=150m},
            new Amortizacion {Fecha=Convert.ToDateTime("21/01/2012"), Idbanco=1, Nbanco="Bancomer", Idgrupo=4, Ngrupo="CBI", Npersona="Juan", Monto=400m},
            new Amortizacion {Fecha=Convert.ToDateTime("21/01/2012"), Idbanco=1, Nbanco="Bancomer", Idgrupo=4, Ngrupo="CBI", Npersona="Manuel", Monto=450m},
            new Amortizacion {Fecha=Convert.ToDateTime("22/01/2012"), Idbanco=2, Nbanco="Afirme", Idgrupo=5, Ngrupo="Pepe", Npersona="Pepe", Monto=300m},
        };

并这样定义我的类:

class Amortizacion
{
    public DateTime Fecha { get; set; }
    public int Idgrupo { get; set; }
    public string Ngrupo { get; set; }
    public int Idbanco { get; set; }
    public string Nbanco { get; set; }
    public string Npersona { get; set; }
    public decimal Monto { get; set; }
}

我想实现一个嵌套的groupby,以便在树视图控件中显示它。首先,我需要按费查分组,然后按伊班科分组,最后按伊格鲁波分组。我想要的结果是这样的:

  • 2012年1月20日(4)
    • Bancomer
      • 豪尔赫500
    • Affirme
      • CreaB 750
        • Noe 200
        • 胡里奥250
        • Marcela 300
  • 2012年1月21日(3)
    • Bancomer
      • Pedro 150
      • CBI 850
        • Juan 400
        • Manuel 450
  • 2012年1月22日(1)acredidados
    • Affirme
      • Pepe 300

请注意,在"Fecha"节点中,括号之间的数字是按分组的字段数,而在"Idgrupo"节点中显示的数量是单个"Monto"的总和。

到目前为止,我已经编码了

var gpoFecha = lista.GroupBy(g => g.Fecha);
        int ifecha = 0;
        foreach (var fecha in gpoFecha)
        {
            TreeNode nodoFecha = new TreeNode(fecha.Key.ToString());
            treeAm.Nodes.Add(nodoFecha);
            var gpoBanco = fecha.GroupBy(gp => gp.Idbanco);
            foreach (var banco in gpoBanco)
            {
                int ibanco = 0;
                TreeNode nodoBanco = new TreeNode(banco.Key.ToString());
                treeAm.Nodes[ifecha].Nodes.Add(nodoBanco);
                var gpoGrpo = banco.GroupBy(gpo => gpo.Idgrupo);
                foreach (var cred in gpoGrpo)
                {
                    TreeNode nodoCred = new TreeNode(cred.Key.ToString());
                    treeAm.Nodes[ifecha].Nodes[ibanco].Nodes.Add(nodoCred);
                }
                ibanco++;
            }
            ifecha++;
        }

问题是我的代码没有按预期工作。另一个问题是,我不知道如何在树节点中不仅显示密钥,还显示定义该密钥的字符串(我的意思是IdBanco=1必须显示Nbanco="Bancomer",就像我上面显示的那样)

另一个令人厌烦的问题是:这是最有效的方法吗?感谢

按LINQ将组嵌套到树视图

var query = from l in lista
            group l by l.Fecha into fetchaGroup
            select new
            {
                Fecha = fetchaGroup.Key,
                Count = fetchaGroup.Count()
                ,FetchaGroup = (from fg in fetchaGroup
                                   group fg by fg.Nbanco into NbancoGroup
                                   select new
                                   {
                                       Nbanco = NbancoGroup.Key,
                                       NbancoGroup = (from ng in NbancoGroup
                                                      group ng by ng.Ngrupo into NgrupoGroup
                                                      select new { Ngrupo = NgrupoGroup.Key, NgrupoGroup }
                                                    )
                                   }
                                )
            }
            ;

foreach (var g in query)
{
    Console.WriteLine("{0} ({1})", g.Fecha, g.Count);
    foreach (var fg in g.FetchaGroup)
    {
        Console.WriteLine("'t{0}", fg.Nbanco);
        foreach (var ng in fg.NbancoGroup)
        {
            Console.WriteLine("'t't{0} {1}", ng.Ngrupo, ng.NgrupoGroup.Sum(ngg => ngg.Monto));
            if (ng.NgrupoGroup.Count() > 1)
            {
                foreach (var ngg in ng.NgrupoGroup)
                {
                    Console.WriteLine("'t't't{0} {1}", ngg.Npersona, ngg.Monto);
                }
            }
        }
    }
}