我有一个非常奇怪的问题,不知道我应该采取哪种方式来解决它。
我有一个IEnumerable<Dictionary<string,object>>
,它可以包含一个或多个IEnumerable<Dictionary<string,object>>
.
现在,需要将此 Dictionary 导入 DataTable,如果IEnumberable<Dictionary<string,object>>
里面有 0 个子项,则 DataTable 应该只包含一行,其中 Column 名称为字符串,RowData 为对象(本例中为字符串)。但是,如果有一个孩子,那么 DataTable 应该包含与这个孩子相同的行数,以及来自父级的每一行中的其他信息。
例如,父 Dictionary 具有以下值:
字符串,对象 --------------- 名字,迈克 姓氏,泰森
IEnumerable 字典子级具有:
字符串,对象 ---------------- [0] 孩子的名字,约翰 儿童年龄, 10 [1] 孩子的名字,托尼 儿童年龄, 12
结果应该是:
姓名 LastName ChildName ChildAge ------------------------------------------ 迈克泰森约翰 10 迈克泰森托尼 12
此外,父 IEnumerable 可以有许多子 IEnumerable,但它们的大小都相同。
有谁知道如何解决这个问题?
static void Main(string[] args)
{
var child1 = new List<Dictionary<string, object>>();
var childOneDic = new Dictionary<string, object>
{
{ "ChildName", "John" },
{ "ChildAge", 10 }
};
child1.Add(childOneDic);
var child2 = new List<Dictionary<string, object>>();
var childTwoDic = new Dictionary<string, object>
{
{ "ChildName", "Tony" },
{ "ChildAge", 12 }
};
child2.Add(childTwoDic);
var parrent = new List<Dictionary<string, object>>();
var parrentDic = new Dictionary<string, object>
{
{ "Name", "Mike" },
{ "LastName", "Tyson" },
{ "child1", child1 },
{ "child2", child2 }
};
parrent.Add(parrentDic);
var table = new DataTable();
table.Columns.Add("Name");
table.Columns.Add("LastName");
table.Columns.Add("ChildName");
table.Columns.Add("ChildAge");
table = CreateTable(parrent, null, table);
}
static DataTable CreateTable(IEnumerable<Dictionary<string, object>> parrent,
DataRow row, DataTable table)
{
if (row == null)
{
row = table.NewRow();
}
foreach (var v in parrent)
{
foreach (var o in v)
{
if (o.Value.GetType().IsGenericType)
{
var dic = (IEnumerable<Dictionary<string, object>>) o.Value;
CreateTable(dic, row, table);
}
else
{
row[o.Key] = o.Value;
}
}
if (row.RowState == DataRowState.Added)
{
DataRow tempRow = table.NewRow();
tempRow.ItemArray = row.ItemArray;
table.Rows.Add(tempRow);
}
else
{
table.Rows.Add(row);
}
}
return table;
}