如何使用 PLinq 将二维文本文件读入二维数组
How to read a 2d text file into an 2d array with 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
来检查它。
您可以将锯齿状数组转换为二维数组,如 Tim Schmelter 所示。
在您的示例中,您不必要地一次又一次地读取同一个文件,而这件事实际上与 PLINQ 没有任何关系。您可以将文件一次读入数组。即:
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Text Files(*.txt)|*.txt";
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
var quality_of_service_array = File.ReadAllLines(ofd.FileName)
.Select(l => l.Split(',').Select(i => double.Parse(i)).ToArray());
}
PS:没有第二个 ToArray() 你会得到一个 IEnumerable。对于大文件,您可以简单地在循环中使用 StreamReader 和 ReadLine,然后解析我认为从性能角度来看哪个更有效。
我有一个这样的 .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
来检查它。
您可以将锯齿状数组转换为二维数组,如 Tim Schmelter 所示。
在您的示例中,您不必要地一次又一次地读取同一个文件,而这件事实际上与 PLINQ 没有任何关系。您可以将文件一次读入数组。即:
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Text Files(*.txt)|*.txt";
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
var quality_of_service_array = File.ReadAllLines(ofd.FileName)
.Select(l => l.Split(',').Select(i => double.Parse(i)).ToArray());
}
PS:没有第二个 ToArray() 你会得到一个 IEnumerable。对于大文件,您可以简单地在循环中使用 StreamReader 和 ReadLine,然后解析我认为从性能角度来看哪个更有效。