簡體   English   中英

C# - 如何從字典創建數據表?

[英]C# - How to create a DataTable from a dictionary?

我有一個統計值字典,它基本上是這樣的:

Dictionary<StatisticsType, List<Value>>

StatisticsType是一個枚舉,它由諸如 Minimum、Maximum、StdDev、Count 等標志組成。 這是Value類的一個非常簡化的版本:

public class Value
{
    public DateTime Timestamp { get; set; }
    public double Value { get; set; }
}

現在我想使用SqlBulkCopy對象將此數據寫入 SQL Server 數據庫。 為此,我需要創建一個DataTable ,其中包含來自字典的數據,如下所示:

DataTable table = new DataTable();
returnValue.Columns.Add("Time", typeof(DateTime));
returnValue.Columns.Add("Count", typeof(double));
returnValue.Columns.Add("Minimum", typeof(double));
returnValue.Columns.Add("Maximum", typeof(double));
returnValue.Columns.Add("Average", typeof(double));
returnValue.Columns.Add("StdDev", typeof(double));

通常對於每個時間戳,字典中的每個列表中都會有一個值,所以我需要找到下一個時間戳(可能來自字典中的第一個列表?),從每個列表中讀取帶有此時間戳的統計值然后把它們放在桌子的一排。 將字典中的數據放入該表的最佳方法是什么? 我不能簡單地為字典中的每個值創建一個新行,因為每行都需要包含某個時間戳的所有統計值。

嘗試以下:

    class Program
    {
        static void Main(string[] args)
        {
            DataTable table = new DataTable();
            table.Columns.Add("Type", typeof(string));
            table.Columns.Add("Time", typeof(DateTime));
            table.Columns.Add("Count", typeof(double));
            table.Columns.Add("Minimum", typeof(double));
            table.Columns.Add("Maximum", typeof(double));
            table.Columns.Add("Average", typeof(double));
            table.Columns.Add("StdDev", typeof(double));

            Dictionary<StatisticsType, List<Value>> dict = new Dictionary<StatisticsType, List<Value>>();

            foreach(KeyValuePair<StatisticsType, List<Value>> row in dict)
            {
                double average = row.Value.Average(x => x.Value);
                double sumOfSquaresOfDifferences = row.Value.Select(val => (val.Value - average) * (val.Value - average)).Sum();
                double sd = Math.Sqrt(sumOfSquaresOfDifferences / row.Value.Count());

                table.Rows.Add(new object[] {
                    row.Key.ToString(),
                    row.Value.First().Timestamp,
                    row.Value.Count(),
                    row.Value.Min(x => x.Value),
                    row.Value.Max(x => x.Value),
                    average,
                    sd});
            }
        }
    }
    public enum StatisticsType
    {
        Minimum, 
        Maximum, 
        StdDev, 
        Count 
    }
    public class Value
    {
        public DateTime Timestamp { get; set; }
        public double Value { get; set; }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM