我有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>
答案 0 :(得分:1)
有点hacky但是如果你想避免for
和foreach
那么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();
答案 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();
}