在C#中将List <double>转换为DataTable列

时间:2018-05-04 05:37:20

标签: c# list datatable

我有4个双打列表,每个列表都包含数据表的单个列的整个值。 说,

List<double> ValuesA = new List<double>(){0.1,0.2,0.3};
List<double> ValuesB = new List<double>(){0.4,0.5,0.6};
List<double> ValuesC = new List<double>(){0.7,0.8,0.9};
List<double> ValuesD = new List<double>(){1.1,1.2,1.3};

我想要一个像

这样的数据表
0.1  0.4  0.7  1.1
0.2  0.5  0.8  1.2
0.3  0.6  0.9  1.3

我知道总有一种使用for / foreach循环的方法,但是有没有“更聪明”的方法,比如Linq查询还是......?/ / p>

4 个答案:

答案 0 :(得分:1)

有点hacky但是如果你想避免forforeach那么Linq是一种方法

//determine the max number of rows in case of the List<decimal> are not all equal length
int rows = new[] { ValuesA.Count, ValuesB.Count, ValuesC.Count, ValuesD.Count, }.Max();

Enumerable.Range(0, rows).Select(x => {
    dt.Rows.Add(ValuesA.ElementAtOrDefault(x),
    ValuesB.ElementAtOrDefault(x),
    ValuesC.ElementAtOrDefault(x),
    ValuesD.ElementAtOrDefault(x));
    return true; }).ToList();

https://dotnetfiddle.net/WXIwT7

如果所有列表的长度相同,请使用ValuesA.Count

Enumerable.Range(0, ValuesA.Count).Select(x => {dt.Rows.Add(ValuesA[x],ValuesB[x], ValuesC[x],ValuesD[x]);return true;}).ToList();

https://dotnetfiddle.net/NTIb2O

答案 1 :(得分:0)

可以;但是你需要考虑你应该

如果问题如问题中所述,则不值得付出努力。一个简单的for循环完成了这项工作。

如果这是一个XY problem并且您实际上在问“我能写一些通常会收集列表并将其转换为数据表的内容”,那么是的,但是您将不得不努力工作。

对于您所描述的情景,这不值得付出努力。例如,通用版本需要处理具有不同长度和可能不同类型的列表。

更新编辑问题 Linq迭代了可枚举的东西。你有4个可枚举的东西,所以你必须迭代它们中的每一个,这比for循环更省力。

答案 2 :(得分:0)

下面是将4列表转换为DataTable的简单代码。但是,它适用于常规固定列和列表项。

using System;
using System.Data;
using System.Linq;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Xml;

public class Program
{
    public static void Main()
    {

        List<double> ValuesA = new List<double>(){0.1,0.2,0.3};
        List<double> ValuesB = new List<double>(){0.4,0.5,0.6};
        List<double> ValuesC = new List<double>(){0.7,0.8,0.9};
        List<double> ValuesD = new List<double>(){1.1,1.2,1.3};

        var values = new List<object>();
        values.Add(new { A = ValuesA[0], B = ValuesB[0], C = ValuesC[0], D = ValuesD[0] });
        values.Add(new { A = ValuesA[1], B = ValuesB[1], C = ValuesC[1], D = ValuesD[1] });
        values.Add(new { A = ValuesA[2], B = ValuesB[2], C = ValuesC[2], D = ValuesD[2] });


        var jsonString = JsonConvert.SerializeObject(values);
        //Console.WriteLine(jsonString);


        var dataTable = JsonConvert.DeserializeObject<DataTable>(jsonString);


        foreach (DataRow row in dataTable.Rows)
        {
            Console.WriteLine(string.Format("{0}\t{1}\t{2}\t{3}", row[0], row[1], row[2], row[3]));
        }
    }
}

答案 3 :(得分:0)

如果你在&#34;更聪明&#34; 的理解下,想要使用LINQ获得一些&#34;花哨的&#34; 代码,请记住,根据该代码可以运行一些&#34;丑陋&#34; 代码(通常,我个人认为他们非常漂亮&#34;漂亮&#34; ),可能导入一些外部dll并使用不安全的代码。如果您不想直接处理for / foreach循环,只需编写自定义扩展方法:

public static class MyExtensions
{
    public static DataTable GetDataTable(this List<List<double>> vs) //You can even make it Generic
    {
        DataTable result = new DataTable();
        //TODO: Use for/foreach loops here
        return result;
    }
}

public static void Main(string[] args)
{
    List<double> ValuesA = new List<double>(){0.1,0.2,0.3};
    List<double> ValuesB = new List<double>(){0.4,0.5,0.6};
    List<double> ValuesC = new List<double>(){0.7,0.8,0.9};
    List<double> ValuesD = new List<double>(){1.1,1.2,1.3};

    var nlist = new List<List<double>>() { ValuesA, ValuesB, ValuesC, ValuesD };
    DataTable table = nlist.GetDataTable();
}