[英]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列。
但我得到这个错误:
无法将类型'double [] []'隐式转换为'double [ , ]。
我知道这个错误的意思,但我不是PLinq的专家。
你没有使用PLINQ
。 此外,还没有一种从LINQ查询返回2d数组的简单方法。 如果您坚持使用LINQ,可以使用此方法进行转换:
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表示,您可以将锯齿状阵列转换为2D阵列。
在您的示例中,您不必要地一次又一次地读取相同的文件,这件事与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,并解析哪个从我认为的性能点更有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.