从单个数据表中获取树形图形式的数据表
Getting DataTables in tree diagram form from a single DataTable
我有一个包含以下列的数据表:类型、名称、年份、版本。我想要包含唯一组合的数据表。 table 首先被分成多个具有唯一名称+年份组合的 table。
这些 table 需要再次拆分为具有唯一类型的 table。一共有4种,8种不同的姓名+年份组合。所以我试图从单个 Datatable.
中提取总共 64 个 Datatable
我试图首先获得姓名 + 年份的不同组合。我已将它们添加到列表中(class 包含名称和数据 table),如果原始 table 中的一行包含该组合,我将其添加到新的数据表中。
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 个不同的 table 并且几乎必须再次执行相同的过程才能按类型拆分。
有没有更简洁、更简单的方法来做到这一点?
这是一个 linq 解决方案。我很长时间没有使用 DataTables,通常我将数据转换为 DomainObjects 或模型,然后在绑定到 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());
}
我有一个包含以下列的数据表:类型、名称、年份、版本。我想要包含唯一组合的数据表。 table 首先被分成多个具有唯一名称+年份组合的 table。 这些 table 需要再次拆分为具有唯一类型的 table。一共有4种,8种不同的姓名+年份组合。所以我试图从单个 Datatable.
中提取总共 64 个 Datatable我试图首先获得姓名 + 年份的不同组合。我已将它们添加到列表中(class 包含名称和数据 table),如果原始 table 中的一行包含该组合,我将其添加到新的数据表中。
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 个不同的 table 并且几乎必须再次执行相同的过程才能按类型拆分。
有没有更简洁、更简单的方法来做到这一点?
这是一个 linq 解决方案。我很长时间没有使用 DataTables,通常我将数据转换为 DomainObjects 或模型,然后在绑定到 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());
}