【问题标题】:Getting DataTables in tree diagram form from a single DataTable从单个数据表中获取树形图形式的数据表
【发布时间】:2019-06-07 18:38:55
【问题描述】:

我有一个包含以下列的数据表:类型、名称、年份、版本。我想要包含唯一组合的数据表。该表首先分为具有唯一名称+年份组合的多个表。 这些表需要再次拆分为具有唯一类型的表。共有4种类型,名称+年份的8种不同组合。所以我试图从一个数据表中提取总共 64 个数据表。

我尝试首先获得名称 + 年份的不同组合。我已将它们添加到列表(包含名称和数据表的类),如果原始表中的一行包含该组合,我将其添加到新的数据表中。

DataTable distinctTable = table.DefaultView.ToTable(true, new string[] { name,year });

foreach(var combo in distinctTable) 
{
        complexlist.add(new ComplexList(row[name].ToString() + row[year].ToString()){table = table.Clone()});
}
            foreach (DataRow row in table.Rows)
        {
            foreach(var item in complexlist)
            {

                if(item.Name == row[name].ToString() + row[year].ToString())
                {
                    item.table.Rows.Add(row.ItemArray);
                }
            }
        }

现在我有 8 个不同的表,并且几乎必须再次执行相同的过程才能按类型拆分。

有没有更简洁、更简单的方法来做到这一点?

【问题讨论】:

    标签: c# .net system.data


    【解决方案1】:

    这是一个 linq 解决方案。很久没用过DataTables了,一般都是先把数据转换成DomainObjects或者Models,然后再绑定到UI之前使用。

    
            class DomainObject
            {
                public string Name { get; set; }
                public int Year { get; set; }
                public string Type { get; set; }
                public string Version { get; set; }
            }
            class GroupedDomainObject
            {
                public string Name { get; set; }
                public int Year { get; set; }
                public string Type { get; set; }
                public IEnumerable<string> Versions { get; set; }
            }
    
            private IEnumerable<GroupedDomainObject> ConvertDataTableToGroupedDomainObject(DataTable dataTable)
            {
                IEnumerable<DomainObject> complexList = dataTable.Select()  // DataTable Select turns it into an IEnumerable
                    .Select(r => new DomainObject  // a linq Select turns it into your DomainObject
                    {
                        Name = r["Name"].ToString(),
                        Year = Convert.ToInt16(r["Year"]),
                        Type = r["Type"].ToString(),
                        Version = r["Version"].ToString()
                    });
    
                // now use linq GroupBy to turn it into (your 64) distinct Groups
                return complexList.GroupBy(i => new { i.Name, i.Year, i.Type }, (key, items) => new GroupedDomainObject
                {
                    Name = key.Name,
                    Year = key.Year,
                    Type = key.Type,
                    Versions = items.Select(o => o.Version)
                });
    
            }
    
            private void testConversionToGroupedDomainObject()
            {
                var mike = new DataTable();
                mike.Columns.Add("Name", typeof(string));
                mike.Columns.Add("Year", typeof(int));
                mike.Columns.Add("Type", typeof(string));
                mike.Columns.Add("Version", typeof(string));
                mike.Rows.Add("NameOne", 2019, "TypeA", "Version1");
                mike.Rows.Add("NameOne", 2018, "TypeB", "Version2");
                mike.Rows.Add("NameOne", 2018, "TypeB", "Version3");
                mike.Rows.Add("NameOne", 2018, "TypeB", "Version4");
                mike.Rows.Add("NameTwo", 2019, "TypeA", "Version1");
                mike.Rows.Add("NameTwo", 2018, "TypeB", "Version2");
                mike.Rows.Add("NameTwo", 2018, "TypeB", "Version3");
                mike.Rows.Add("NameTwo", 2018, "TypeB", "Version4");
    
                var result = ConvertDataTableToGroupedDomainObject(mike);
    
                Debug.Assert(mike.Rows.Count == result.Select(r => r.Versions).Count());
            }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多