質問: new Dictionary(); //何らかの処理 return newDictionary; } ```
回答: Linqを使って新しいディクショナリを作成する方法です。 `前行No > 後行No`の場合も想定しています。 使用する場合は下記の留意点にご注意ください * ディクショナリのキーを入れ替える処理に複数の三項演算子を使って可読性が低い * 連続したキー番号のみを想定している * 最初にキー番号で並べ替えている ``` using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Dictionary oldDictionary = new Dictionary(); oldDictionary.Add(1, "日本円"); oldDictionary.Add(2, "アメリカドル"); oldDictionary.Add(3, "オーストラリアドル"); oldDictionary.Add(4, "ニュージーランドドル"); foreach (var item in oldDictionary.OrderBy((x) => x.Key)) { Console.WriteLine(item.Key + "_" + item.Value); } Dictionary newDictionary = ChangeOrder(oldDictionary, 2, 4); foreach (var item in newDictionary.OrderBy((x) => x.Key)) { Console.WriteLine(item.Key + "" + item.Value); } //欲しい結果(2番目のアメリカドルを4番目にする。あとは元の並び順通り) //1 日本円 //2 オーストラリアドル //3 ニュージーランドドル //4 アメリカドル newDictionary = ChangeOrder(oldDictionary, 1, 3); foreach (var item in newDictionary.OrderBy((x) => x.Key)) { Console.WriteLine(item.Key + "" + item.Value); } //欲しい結果(1番目の日本円を3番目にする。あとは元の並び順通り) //1 アメリカドル //2 オーストラリアドル //3 日本円 //4 ニュージーランドドル ChangeOrder(oldDictionary, 4, 1).OrderBy(x => x.Key).ToList().ForEach(item => { Console.WriteLine(item.Key + "" + item.Value); }); //結果(4番目のニュージーランドドルを1番目にする。あとは元の並び順通り) //1 ニュージーランドドル //2 日本円 //3 アメリカドル //4 オーストラリアドル Console.ReadLine(); } static Dictionary ChangeOrder(Dictionary oldDictionary, int src, int dst) { // 行番号の範囲チェックが必要ならばこの場所で行う。 // Dictionaryをコピーして並べ替え var dic = new SortedDictionary(oldDictionary); // 入れ替える並び順を変える係数 var addition = (src < dst) ? -1 : 1; return dic .Select(p => new { k = (p.Key < Math.Min(src, dst) || p.Key > Math.Max(src, dst)) ? p.Key : (p.Key == src) ? dst : p.Key + addition, v = p.Value }) .ToDictionary(p => p.k, p => p.v); } } } ```