2017-02-02 2 views
0

で作業するときに例外を取得:私が達成しようとしている何私は下に次のようなコード書かれているリストと並列ループ

// itm - list whos data comes from DB 
// filteredList => whos data comes from an external source 

Parallel.ForEach(filteredList, (f) => 
{ 
    var conditionMatchCount = itm.AsParallel().Max(i => 
     // One point if ID matches 
     ((i.ItemID == f.ItemID) ? 1 : 0) + 
     // One point if ID and QuantitySold match 
     ((i.ItemID == f.ItemID && i.QuantitySold == f.QuantitySold) ? 1 : 0) 
    ); 
    // Item is missing 
    if (conditionMatchCount == 0) 
    { 
     ListToUpdate.Add(f); 
     missingList.Add(f); 
    } 
    // Item quantity is different 
    else if (conditionMatchCount == 1) 
    { 
     ListToUpdate.Add(f); 
    } 
}); 

を、私は基本的に2つのリストを持っています上記のコードは、2つのリストを比較することです

フィルタリングされたリスト(新しいもの)からのアイテムが "itm"リストに存在しないことを確認してください...

彼らは「ITM」リストに存在しない場合、それらは

missingList.Add(f); 

に追加されます。また、「ITM」リストの1つとは異なる別のQuantitySoldプロパティを持っているすべての項目は、私がListToUpdateに同様にそれらを追加します。

私はここで取得していますエラーは次の行にある:

else if (conditionMatchCount == 1) 
{ 
    ListToUpdate.Add(f); 
} 

そして、それは言う:

先配列は、十分な長さではなかったです。 destIndexと長さと配列の下限を確認してください

私はここで間違っていますか?

P.S.皆さん、ListToUpdateとMissing listは単純なリストですが、ここで問題が発生していますか?

+0

[宛先の配列が長すぎますか?](http://stackoverflow.com/questions/10362023/destination-array-not-long-enough) – Equalsk

答えて

1

List<T>に複数のスレッドを使用しないでください。スレッドセーフではありません。

System.Collections.Concurrentのコレクションを使用することを検討してください。

+0

私の利益のために、オプションもありますか?データ型を変更するのが最良だが、これが不可能な場合は同意する... – Equalsk

+0

これは可能だが、事態は苦しむ可能性がある。 –

+0

@Equalsk良い点...もし私がコンカレントバッグや他のものに変換した場合は、コード全体を混乱させるでしょう。 – User987

関連する問題