如何使用PLinq将2d文本文件读入2d数组

时间:2015-12-02 08:34:49

标签: 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列 但是我得到了这个错误:

  

无法隐式转换类型' double [] []'要加倍[]。

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

2 个答案:

答案 0 :(得分:3)

您没有使用PLINQ。此外,还没有一种从LINQ查询返回2d数组的简单方法。如果您坚持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进行检查。

答案 1 :(得分:0)

Tim Schmelter表示,您可以将锯齿状阵列转换为2D阵列。

在您的示例中,您不必要地一次又一次地阅读相同的文件,这件事与PLINQ没有任何关系。您可以将文件读入数组一次。即:

$fileprefix*: The filename, directory name, or volume label syntax is incorrect.

PS:没有第二个ToArray(),你会得到一个IEnumerable。对于一个大文件,您可以简单地在循环中使用StreamReader和ReadLine,并解析哪个从我认为的性能点更有效。