簡體   English   中英

如何使用PLinq將2d文本文件讀入2d數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM