Преобразовать список <double>в столбец DataTable в C # - PullRequest
0 голосов
/ 04 мая 2018

У меня есть 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 или sth?

Ответы [ 4 ]

0 голосов
/ 04 мая 2018

Если вы под «умнее» понимаете, чтобы иметь какой-нибудь «причудливый» код, с LINQ, просто помните, что под этими кодами работает некоторое «уродливое» кодов (обычно, я лично считаю, что они довольно "красивые" ), вероятно, импортируя некоторые внешние 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();
}
0 голосов
/ 04 мая 2018

Ниже приведен простой код, который преобразует список 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]));
        }
    }
}
0 голосов
/ 04 мая 2018

Немного хакерский, но если вы хотите избежать 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();

https://dotnetfiddle.net/NTIb2O

0 голосов
/ 04 мая 2018

Вы могли ; но вам нужно подумать, стоит ли вам .

Если проблема такова, как указано в вопросе, то это не стоит усилий. Простой цикл for делает свою работу.

Если это XY проблема и вы на самом деле спрашиваете: «Могу ли я написать что-то, что в общем случае возьмет коллекцию списков и превратит ее в таблицу данных», тогда да, но вы собираетесь чтобы работать, нужно больше работать.

Для сценария, который вы описали, усилия не стоят. Например, общая версия должна иметь дело со списками, которые имеют разную длину и возможны разные типы.

Обновление для редактирования на вопрос Linq перебирает то, что перечислимо. У вас есть 4 вещи, которые можно перечислить, поэтому вам придется перебирать каждую из них, что потребует больше усилий, чем цикл for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...