C#将每列的值转换为数组

我想转换一个C#对象或数据表,使每个列成为一个键,值成为一个数组

year productOne ProductTwo ProductThree 2010 1 2 3 2011 10 20 30 2012 100 200 300 2013 1000 2000 3000 

我期待生成以下JSON输出。 请记住,行和列都不是动态的。

 [{ name: productOne , data: [1,10,100,1000] },{ name: productTwo , data: [2,20,200,2000] },{ name: productThree , data: [3,30,300,3000] }] 

 DataTable dt = new DataTable(); dt.Columns.Add("col1"); dt.Columns.Add("col2"); dt.Columns.Add("col3"); DataRow dr = dt.NewRow(); dr[0] = "10"; dr[1] = "20"; dr[2] = "30"; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = "100"; dr[1] = "200"; dr[2] = "300"; dt.Rows.Add(dr); dr = dt.NewRow(); dr[0] = "1000"; dr[1] = "2000"; dr[2] = "3000"; dt.Rows.Add(dr); List list = new List(); for (int i = 0; i < dt.Columns.Count; i++) { dynamic result = new ExpandoObject(); result.name = dt.Columns[i].ColumnName; result.data = dt.Rows.Cast() .Select(row => row[i]) .ToArray(); list.Add(result); } var op = JsonConvert.SerializeObject(list); 

你绝对可以在Lists and Dictionaries的帮助下完成这项工作。

 public static IDictionary> TransposeDataTable(DataTable table) { if (table == null) { return null; } var dicData = new Dictionary> (); var lstRows = new List[table.Columns.Count]; foreach (DataRow item in table.Rows) { for (var i = 0; i < table.Columns.Count; i++) { if (lstRows [i] == null) { lstRows [i] = new List (); } lstRows [i].Add (item [i]); } } for (var i = 0; i < table.Columns.Count; i++) { dicData.Add (table.Columns [i].ColumnName, lstRows [i]); } return dicData; } 

上面的代码将从表的列名创建字典键,每列的数据将进入相应的列表。 这是一种元组。

我们假设您的DataTable是有效的dt

 var dataObject = TransposeDataTable (dt); var jsonString = JsonConvert.SerializeObject (dataObject, Formatting.Indented); 

转换成功后, jsonString将包含我们漂亮的Json对象。 就我而言,作为虚拟数据的dt会产生类似的东西。

 { "year": [ "2010", "2011", "2012", "2013", "2014" ], "produceOne": [ "1", "11", "21", "31", "41" ], "ProductTwo": [ "2", "12", "22", "32", "42" ], "ProductThree": [ "3", "13", "23", "33", "43" ] }