2016-05-01 8 views
0

key:valueのようなフォーマットのファイルを読み込み、Dictionaryに追加するアプリがあります。これは小さなファイルではうまくいきますが、65,000行のファイルを読み込もうとするとうまく動作せず、Dictionary.TryAdd()Index was outside the bounds of the array.がスローされます。インデックスが辞書の配列の境界外にありました

私のアプリケーションを64ビットアーキテクチャ用にコンパイルし、もapp.configに設定します。

private void LoadFile() 
{ 
    ConcurrentDictionary<string, string> Dict = new ConcurrentDictionary<string, string>(); 

    OpenFileDialog dlgFile = new OpenFileDialog(); 
    dlgFile.Filter = "All Files (*.*)|*.*"; 
    dlgFile.FilterIndex = 1; 

    if (dlgFile.ShowDialog() == DialogResult.OK) 
    { 
     foreach (string line in File.ReadLines(dlgFile.FileName)) 
     { 
      // Index was outside the bounds of the array. 
      Dict.TryAdd(line.Split(':')[0], line.Split(':')[1]); 
     } 
    } 
} 
+3

私は問題が配列のインデックスにあると思います。すべての "行"が必要な形式であることを確認していますか?別名は ':'で分割できますか? –

+0

@Daniel Leszenはい、彼らは –

+0

です。もう一度チェックすることをお勧めします。例外がスローされると、その値が何であるかを確認するためにマウスオーバーします。可能性は、 ':'が含まれていない可能性があります - もしあなたがすべてそうしているとすれば、時には最後の(空の)行です。 –

答えて

0

これはほぼ確実にあなたの行の1つに:が含まれていないため、結果の分割string配列へのインデックス付けは2つの部分ではないので失敗します。あなたがそうのような二つの部分持っていない行をスキップでき

:余談として

foreach (string line in File.ReadLines(dlgFile.FileName)) 
{ 
    var parts = line.Split(':'); 

    if (parts.Length == 2) 
    { 
     var key = parts[0]; 
     var value = parts[1]; 
     Dict.TryAdd(key, value); 
    } 
    else 
    { 
     // log that line was ignored 
    } 
} 

を、あなたは同時アクセスを持っていない限り、ConcurrentDictionaryを使用する必要はありません。あなたのアプリケーションには別の場所があるかもしれませんが、あなたが示したコードには何もありません。

+0

私はもう一つの答えにコメントしたので、もう一つ問題があります。 'CLRはCOMコンテキスト0xb40a9278からCOMコンテキスト0xb40a93a0に60秒間移行できませんでした。 ' –

+0

ヒットし続けて待ってください。これはちょうど長い時間を要している可能性があります。これは、UIスレッドでこれを行わないという議論になるかもしれません。 –

+0

'BackgroundWorker'は多分でしょうか? –

0

、次のコードセグメントにforeachの本体を変更してみてください:空のエントリを削除

 var parts = line.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); 
     if (parts.Length > 1) 
     { 
      Dict.TryAdd(parts[0], parts[1]); 
     } 
     else 
     { 
      // ERROR logging 
     } 

がneccesaryではありません、しかし、あなたが辞書に空のキーや値を追加しませんを確認します。また、辞書には同じキーが含まれていないことを確認することをお勧めします。

+0

これは私の問題を解決しましたが、別の問題につながります。 'CLRはCOMコンテキスト0xb40a9278からCOMコンテキスト0xb40a93a0に60秒間移行できませんでした。 ' –

関連する問題