将数据填充到DataTable中的特定单元-C#

时间:2018-03-22 13:25:03

标签: c# dictionary datatable

我有像

这样的数据
 ConcurrentDictionary<string, ConcurrentDictionary<string,string> OneTwoThree =
                new ConcurrentDictionary<string, ConcurrentDictionary<string, string>();

我想要这样的结果Final Image 我尝试了什么:

 DataTable dt = new DataTable();
 dt.Columns.Add("TwoDetails");
 ISet<string> two = new HashSet<string>();
 Parallel.ForEach(OneTwoThree , One=>
             {
                 dt.Columns.Add(One.Key);
                 foreach(var Two in One.Value)
                 { 
                  two.Add(Two.Key); // To get Distinct Values
                 }
             });
 foreach(var item in two)
 { 
   var row = dt.NewRow();
   row["TwoDetails"] = row;
 }

现在我没有想要追加&#34;三值&#34;到特定的单元格,如图所示。

任何建议。

2 个答案:

答案 0 :(得分:1)

另一个数据透视表问题。完成1000.请参阅下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;


namespace ConsoleApplication31
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, Dictionary<string, string>> OneTwoThree = new Dictionary<string, Dictionary<string, string>>() {
                {"A", new Dictionary<string,string>(){{"U","s"}, {"Z","a"}}},
                {"B", new Dictionary<string,string>(){{"W","e"},{"X","d"},{"Y","d"}}},
                {"C", new Dictionary<string,string>(){{"V","f"}, {"W","a"},{"Z","w"}}},
            };

            string[] columns = OneTwoThree.Select(x => x.Key).OrderBy(x => x).ToArray();

            DataTable dt = new DataTable();
            dt.Columns.Add("TwoDetails", typeof(string));
            foreach(string column in columns)
            {
                dt.Columns.Add(column, typeof(string));
            }

            string[] rows = OneTwoThree.Select(x => x.Value.Select(y => y.Key)).SelectMany(x => x).Distinct().OrderBy(x => x).ToArray();
            var flip = rows.Select(x => new { row = x, columns = OneTwoThree.Where(y => y.Value.ContainsKey(x)).Select(y => new { col = y.Key, value = y.Value[x] }).ToList() }).ToList();
            //create pivot table
            foreach (var row in flip)
            {
                DataRow newRow = dt.Rows.Add();
                newRow["TwoDetails"] = row.row;
                foreach (var column in row.columns)
                {
                    newRow[column.col] = column.value;
                }
            }
        }

    }
}

答案 1 :(得分:0)

您无法使用其名称访问数据表行,但使用行号可以在数据表中找到特定行。因此,您需要创建一个类,如

 public class DataTableDetails
{
    public string RowName { get; set; }
    public int RowNumber { get; set; }
}

这不是有效的解决方案,但可以帮助你

    ISet<string> two = new HashSet<string>();
    List<DataTableDetails> dtdetaills=new List<DataTableDetails>();
     Parallel.ForEach(OneTwoThree , One=>
                 {
                     dt.Columns.Add(One.Key);
                     foreach(var Two in One.Value)
                     { 
                      two.Add(Two.Key); // To get Distinct Values
                     }
                 });
int count=0;
foreach(var item in two)
 { 
   var row = dt.NewRow();
   row["TwoDetails"] = row;
   DataTableDetails details = new DataTableDetails();
   details.RowName = item;
   details.RowNumber = count++; // we can easily get row number 
   dtdetails.Add(details);
 }

最后

foreach(var One in OnrTwoThree)
            {
                foreach(var Two in One.Value)
                {
                   foreach(var rowdetails in dtdetails)
                    {
                        if(Two.Key==rowdetails.RowName)
                        {
                            dt.Rows[rowdetails.RowNumber][One.Key] = Two.Value;
                        }

                    }
                }
            }