items.AsParallel().ForAll(i =>
{
string[] splitter = i.Split('\t');
Console.WriteLine(string.Format("Converted: {0} - {1} - {2}", splitter[0], splitter[1], splitter[2]));
productList.Add(Convert.ToInt32(splitter[0]), splitter[1] + "\t" + splitter[2]);
// the above line is where the error prompts
});
「items」は、タブで区切られた製品 ID、名前、および詳細の値を持つ ConcurrentStack です。
元:
items[0] = 1\tシャンプー\t髪をきれいにする
項目を 3 つの配列インデックス (スプリッター) に分割し、それを「productList」に追加する並列ループがあります。「productList」は SortedList です。分割された値をproductListに追加すると、IDがキーになり、名前と詳細が値になります。
元:
スプリッター [0] = 1; スプリッター[1] = シャンプー; スプリッター[2] = 髪をきれいにします
productList[0] キー = 1; productList[1] 値 = シャンプー\t髪をきれいにする
奇妙な部分は、プログラムが問題なく実行されることもあれば、ArgumentException was unhandled by user code エラーが表示されることもあります。これはエラーの詳細です:「オフセットと長さが配列の範囲外であるか、カウントがインデックスからソース コレクションの末尾までの要素数を超えています。」. パラレルの使用はこれと関係がありますか? 問題は、並列を使用してループをより高速に実行する必要があることです。
注: データはサンプルです。
更新:string[] スプリッターを var スプリッターで変更しようとしたところ、次のエラーが発生しました:「宛先配列の長さが十分ではありません。destIndex と長さ、および配列の下限を確認してください。」. Immediate Windows で productList を確認したところ、このエラーが表示される前にいくつかのデータが追加されていました。