c# - 如何使用 PLinq 将二维文本文件读入二维数组

标签 c# arrays linq parallel-processing plinq

我有一个这样的 .txt 文件:

1,2,3,4,5  
6,7,8,9,10  
11,12,13,14,15  
16,17,18,19,20

我想使用 PLinq 将此文件读入双数组,代码如下:

        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "Text Files(*.txt)|*.txt";
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            number_of_users = File.ReadAllLines(ofd.FileName).Length;
            number_of_services = File.ReadAllLines(ofd.FileName)[0].Split(',').Length;    
            quality_of_service_array = new double[number_of_users, number_of_services]; 
            quality_of_service_array = File.ReadAllLines(ofd.FileName)
               .Select(l => l.Split(',').Select(i => double.Parse(i)).ToArray())
               .ToArray();
}

这个数组应该有 4 行和 5 列。
但是我得到这个错误:

Cannot implicitly convert type 'double[][]' to 'double[,].

我知道这个错误的含义,但我不是 PLinq 专家。

最佳答案

您没有使用 PLINQ。此外,没有一种从 LINQ 查询返回二维数组的简单方法。如果你坚持使用 LINQ,你可以使用 this method转换它:

public T[,] JaggedToMultidimensional<T>(T[][] jaggedArray)
{
    int rows = jaggedArray.Length;
    int cols = jaggedArray.Max(subArray => subArray.Length);
    T[,] array = new T[rows, cols];
    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < cols; j++)
        {
            array[i, j] = jaggedArray[i][j];
        }
    }
    return array;
}

那么就很简单了(使用 AsParallel 因为你提到了 PLINQ):

double[][] quality_of_service_array = File.ReadLines(ofd.FileName).AsParallel()
    .Select(l => Array.ConvertAll(l.Split(','), double.Parse))
    .ToArray();
double[,] qos_2d = JaggedToMultidimensional(quality_of_service_array);

这假定文本文件中的格式始终正确,否则您会在 double.Parse 处遇到异常。您可以使用 double.TryParse 来检查它。

关于c# - 如何使用 PLinq 将二维文本文件读入二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34038097/

相关文章:

c# - 如何在 Windows 事件查看器中删除和创建日志

c# - 调试 ASP.NET 无法使用前导 .. 退出顶级目录

c# - 可空引用类型和 ToString() 重载

c - neighbors.c程序调试(多维数组)

c# - Linq Join 和/或 Filter on DateTime 评估?

c# - LINQ to Objects - ICollection 属性到 CSV 的一般转换

c# - C#中的Null引用异常

c - 在 C 中移动数组的最佳方法?

javascript - 删除数组中负的重复值

c# - 无法在 SqlParameterCollection 上使用 FirstOrDefault