2

文字列を分割し、値を辞書にスローする単純な LINQ ステートメントがあります。問題は、ディクショナリに同じ値の既存のキーが既に存在することはめったにないため、例外がスローされ、「dict」の値が空のままになることです。

dict = lines.Select(l => l.Split('|')).ToDictionary(d => d[0], d => d[1]);

LINQ ステートメントを変更して、挿入する前にディクショナリに既にキーがあるかどうかを確認するか、例外をキャッチして残りの値をディクショナリに書き込み続ける方法はありますか? 行の周りに try ブロックを配置しようとしましたが、例外がキャッチされましたが、要素が追加されないため、辞書は空のままです。

4

3 に答える 3

4

ToDictionary通常のキー以外は使用せずforeach、キーをテストしてください。

辞書への変換からクエリを中断します。

var splits = lines.Select(l => l.Split('|'));

var dict = new Dictionary<string,string>();
foreach(var item in splits)
{
   if(!dict.ContainsKey(item[0]))
       dict.Add(item[0], item[1]);
}
于 2013-01-27T19:14:28.930 に答える
3

キーごとにグループを作成するためにいつでも使用できGroupBy、辞書のキーごとに最初の値を選択するだけです。

var dict = lines.Select(x => x.Split('|'))
                .GroupBy(x => x[0], x => x[1])
                .ToDictionary(x => x.Key, x => x.First());
于 2013-01-27T19:33:45.907 に答える
0

キーごとに 1 つの値を保持する辞書が必要な場合は、これを使用できます。

var dict1 = lines
          .Select(l => l.Split('|'))
          .GroupBy(s => s[0])
          .ToDictionary(d => d.Key, d => d.First()[1]);

Dictionary<string,IEnumerable<string>>または、キーと対応する値を次のように保持する必要がある場合は、これを使用できますIEnumerable<string>

var dict2 = lines
           .Select(l => l.Split('|'))
           .GroupBy(s => s[0])
           .ToDictionary(d => d.Key, d => d.Select(r => r[1]));
于 2013-01-27T19:22:04.317 に答える