当前位置: 首页 > 编程语言 > C#

字典列表转数据表分享

时间:2023-04-10 16:01:34 C#

字典列表转数据表目前我们是通过循环遍历列表和字典的每个值来实现的:privateDataTableChangeToDictionary(Listlist){DataTabledatatTableReturn=new数据表();if(list.Count()>0){字典haeders=list.ElementAt(0);foreach(varcolHeadinhaeders){datatTableReturn.Columns.Add(colHead.Key);}}foreach(varrowinlist){DataRowdataRow=datatTableReturn.NewRow();foreach(varcolinrow){dataRow[col.Key]=col.Value;}datatTableReturn.Rows.Add(dataRow);}返回数据表返回;但是有更好的方法吗?循环这么多次感觉不太好。上面的答案没有解决超过1行的字典的问题。这个解决方案解决了这个问题。staticDataTableToDataTable(List>list){DataTableresult=newDataTable();if(list.Count==0)返回结果;varcolumnNames=list.SelectMany(dict=>dict.Keys).Distinct();结果.Columns.AddRange(columnNames.Select(c=>newDataColumn(c)).ToArray());foreach(列表中的字典项){varrow=result.NewRow();foreach(varkeyinitem.Keys){row[key]=item[key];}result.Rows.Add(行);}返回结果;}staticvoidMain(string[]args){List>it=newList>();字典dict=newDictionary();dict.Add("a",1);dict.Add("b",2);字典.Add("c",3);它.Add(字典);字典=新字典();dict.Add("bob",34);dict.Add("汤姆",37);它.Add(字典);字典=新字典();dict.Add("业业",8);dict.Add("YapYap",9);它.Add(字典);DataTable表=ToDictionary(it);foreach(DataColumncolintable.Columns)Console.Write("{0}t",col.ColumnName);控制台.WriteLine();foreach(DataRowrowintable.Rows){foreach(DataColumncolumnintable.列)Console.Write("{0}t",row[column].ToString());控制台.WriteLine();}控制台.ReadLine();}输出看起来像...abcbobtomYipYipYapYap123343789速度、优雅和可重用性不能同时出现你总是选择更重要的一个,并尝试平衡其他两个。代码越快,它就越丑陋。它更漂亮且可重用性更低。这是一个“优雅”解决方案的示例,但这与可读性不同。privatestaticDataTableToDictionary(List>list){DataTableresult=newDataTable();if(list.Count==0)返回结果;result.Columns.AddRange(list.First().Select(r=>newDataColumn(r.Key)).ToArray());list.ForEach(r=>result.Rows.Add(r.Select(c=>c.Value).Cast().ToArray()));返回结果;}试试这个:privateDataTableGetDataTableFromDictionaries(List>list){DataTabledataTable=newDataTable();if(list==null||!list.Any())返回数据表;foreach(varcolumninlist.First().Select(c=>newDataColumn(c.Key,typeof(T)))){dataTable.Columns.Add(column);}foreach(varrowinlist.Select(r=>{vardataRow=dataTable.NewRow();r.ToList().ForEach(c=>dataRow.SetField(c.Key,c.Value));返回数据行;})){dataTable.Rows.Add(行);}返回数据表;}下面的代码怎么样?这很好,因为它只迭代每一行一次。它应该很快,我已经包含了明显的异常以使代码更安全。privatestaticDataTableDictionariesToDataTable(IEnumerable>source){if(source==null){returnnull;}varresult=newDataTable();使用(vare=source.GetEnumerator()){if(!e.MoveNext()){返回结果;}if(e.Current.Keys.Length==0){thrownewInvalidOperationException();}varlength=e.Current.Keys.Length;result.Columns.AddRange(e.Current.Keys.Select(k=>newDataColumn(k,typeof(T))).ToArray());做{if(e.Current.Values.Length!=length){thrownewInvalidOperationException();}result.Rows.Add(e.Current.Values);}while(e.MoveNext());返回结果;}}试试我的解决方案,对我来说似乎很干净:privateDataTableDictonarysToDataTable(List>list){DataTabletable=newDataTable();foreach(Dictionarydictinlist)//foreverydictonaryinthelist..{foreach(KeyValuePairentryindict)//foreveryentryineverydict{if(!myTable.Columns.Contains(entry.Key.ToString())复制代码))//如果它还不存在{myTable.Columns.Add(entry.Key);//将它的所有键作为列添加到表中}}table.Rows.Add(dict.Values.ToArray());//将列表中每个dict的Values添加为新行}returntable;编辑:哦,Snap,这只适用于字典。我没有想到,但也许你可以修改它以适用于字典列表。请尝试上面的C#学习教程:转换列表DictionariestoaDataTablesharewhatitisallaboutifyes大家有用,需要多了解C#学习教程,希望大家多多关注—DataTabletable=newDataTable();foreach(DeviceTypeReport中的IDictionary行){foreach(行中的KeyValuePair条目){if(!table.Columns.Contains(entry.Key.ToString())){table.Columns.Add(entry.Key);}}table.Rows.Add(row.Values.ToArray());}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: