Linq 在C#业务对象中转置数据

Linq 在C#业务对象中转置数据,linq,linq-to-objects,transpose,Linq,Linq To Objects,Transpose,我有下面的场景 List<Class> Classes = new List<Class>(); Class c1 = new Class() { ClassID = 1, Name = "Class1", Abbreviation = "CLS1" }; Classes.Add(c1); Class c2 = new Class() { ClassID = 2, Name = "Class2", Abbreviation = "CLS2" }; Classes.Add(

我有下面的场景

List<Class> Classes = new List<Class>();
Class c1 = new Class() { ClassID = 1, Name = "Class1", Abbreviation = "CLS1" }; Classes.Add(c1);
Class c2 = new Class() { ClassID = 2, Name = "Class2", Abbreviation = "CLS2" }; Classes.Add(c2);
Class c3 = new Class() { ClassID = 3, Name = "Class3", Abbreviation = "CLS3" }; Classes.Add(c3);

List<ClassCode> ClassCodes = new List<ClassCode>();
ClassCode cc1 = new ClassCode() { ClassID = 1, ClassCodeID = 1, Code = "CC1", Description = "CCD1", Class = c1 }; ClassCodes.Add(cc1);
ClassCode cc2 = new ClassCode() { ClassID = 1, ClassCodeID = 2, Code = "CC2", Description = "CCD2", Class = c1 }; ClassCodes.Add(cc2);
ClassCode cc3 = new ClassCode() { ClassID = 2, ClassCodeID = 3, Code = "CC3", Description = "CCD3", Class = c2 }; ClassCodes.Add(cc3);
ClassCode cc4 = new ClassCode() { ClassID = 2, ClassCodeID = 4, Code = "CC4", Description = "CCD4", Class = c2 }; ClassCodes.Add(cc4);
ClassCode cc5 = new ClassCode() { ClassID = 3, ClassCodeID = 5, Code = "CC5", Description = "CCD5", Class = c3 }; ClassCodes.Add(cc5);
ClassCode cc6 = new ClassCode() { ClassID = 3, ClassCodeID = 6, Code = "CC6", Description = "CCD6", Class = c3 }; ClassCodes.Add(cc6);
  • 列标题是基于ClassID(ClassCode)上的group by的名称(类)和缩写(类)值
  • 值是代码(ClassCode)和描述(ClassCode)的浓缩-映射是代码到缩写列,描述到名称列
  • 当您想要在运行时创建属性时,DataTable是一个合适的选项-任何其他选项都将受到欢迎

    请帮忙


    • 您没有解释为什么要这样做。 也许还有其他方法可以实现你想要的

      无论如何,下面的代码应该可以工作。 它会生成一个数据表,我认为这非常适合:

      var dt = new System.Data.DataTable("Transpose");           
      
      foreach (var c in Classes)
      {
          var dc1 = new System.Data.DataColumn(c.Name, typeof(string));
          var dc2 = new System.Data.DataColumn(c.Abbreviation, typeof(string));
          dc1.ExtendedProperties.Add("ID", c.ClassID);
          dc2.ExtendedProperties.Add("ID", c.ClassID);
          dt.Columns.AddRange(new System.Data.DataColumn[] { dc1, dc2 } );
      }
      
      var dr = dt.NewRow();
      
      for (int i = 0; i < dt.Columns.Count; i++)
      {
          var col = dt.Columns[i];
          dr[i++] = ClassCodes.Where(cc => cc.ClassID == (int)col.ExtendedProperties["ID"])
                              .Select(cc => cc.Description)
                              .Aggregate((first, next) => first + next);
          col = dt.Columns[i];
          dr[i] = ClassCodes.Where(cc => cc.ClassID == (int)col.ExtendedProperties["ID"])
                            .Select(cc => cc.Code)
                            .Aggregate((first, next) => first + next);
       }
      
       dt.Rows.Add(dr);
      
      var dt=new System.Data.DataTable(“转置”);
      foreach(类中的var c)
      {
      var dc1=新的System.Data.DataColumn(c.Name,typeof(string));
      var dc2=新的System.Data.DataColumn(c.缩写,typeof(string));
      dc1.ExtendedProperties.Add(“ID”,c.ClassID);
      dc2.ExtendedProperties.Add(“ID”,c.ClassID);
      AddRange(新的System.Data.DataColumn[]{dc1,dc2});
      }
      var dr=dt.NewRow();
      对于(int i=0;icc.ClassID==(int)col.ExtendedProperties[“ID”])
      .Select(cc=>cc.Description)
      .聚合((第一个,下一个)=>第一个+下一个);
      col=dt.列[i];
      dr[i]=classcode.Where(cc=>cc.ClassID==(int)col.ExtendedProperties[“ID”])
      .Select(cc=>cc.Code)
      .聚合((第一个,下一个)=>第一个+下一个);
      }
      dt.Rows.Add(dr);
      
      您是说您不想为此使用DataTable吗?对我来说,这似乎是一个显而易见的选择……谢谢你,很抱歉你的回复太晚了。上面的问题是将一组更大的对象层次结构转换为一个平面结构以将其绑定到网格的一部分
      var dt = new System.Data.DataTable("Transpose");           
      
      foreach (var c in Classes)
      {
          var dc1 = new System.Data.DataColumn(c.Name, typeof(string));
          var dc2 = new System.Data.DataColumn(c.Abbreviation, typeof(string));
          dc1.ExtendedProperties.Add("ID", c.ClassID);
          dc2.ExtendedProperties.Add("ID", c.ClassID);
          dt.Columns.AddRange(new System.Data.DataColumn[] { dc1, dc2 } );
      }
      
      var dr = dt.NewRow();
      
      for (int i = 0; i < dt.Columns.Count; i++)
      {
          var col = dt.Columns[i];
          dr[i++] = ClassCodes.Where(cc => cc.ClassID == (int)col.ExtendedProperties["ID"])
                              .Select(cc => cc.Description)
                              .Aggregate((first, next) => first + next);
          col = dt.Columns[i];
          dr[i] = ClassCodes.Where(cc => cc.ClassID == (int)col.ExtendedProperties["ID"])
                            .Select(cc => cc.Code)
                            .Aggregate((first, next) => first + next);
       }
      
       dt.Rows.Add(dr);