非効率そうなところをざっくり書き換え
foreach で x.Keys を展開して使っている部分のうち、x[key] のような使い方しかしていないものは、最初から x.Values を使うようにした
x[key] アクセスを連続して繰り返している部分は、一旦変数に格納してから使うようにした
x.Contains(key) チェックからの x[key] アクセスは、x.TryGetValue() を使うようにした