嵌套groupby LINQ to treeview

时间:2012-01-20 17:51:26

标签: c# linq treeview

我有以下格式的列表:

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,以便在treeview控件中显示它。首先,我需要由Fecha分组,然后由Idbanco分组,最后由Idgrupo分组。我正在寻找的结果是这样的:

  • 20/01/2012(4)acreditados
    • 班科默
      • Jorge 500
    • Afirme银行
      • CreaB 750
        • Noe 200
        • Julio 250
        • Marcela 300
  • 21/01/2012(3)acreditados
    • 班科默
      • Pedro 150
      • CBI 850
        • Juan 400
        • Manuel 450
  • 22/01/2012(1)acreditados
    • Afirme银行
      • 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”,就像我在上面所示。)。< / p>

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

1 个答案:

答案 0 :(得分:3)

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);
                }
            }
        }
    }
}