1

その値に基づいて辞書をソートし、結果の辞書を取得したい

Dictionary<String, Int32> outputDictionary = new Dictionary<String, Int32>();
outputDictionary.Add("MyFirstValue", 1);
outputDictionary.Add("MySecondValue",2);
outputDictionary.Add("MyThirdValue", 10);
outputDictionary.Add("MyFourthValue", 20);
outputDictionary.Add("MyFifthValue", 5);

値でソートするために3つの方法を使用しました

方法 1:

outputDictionary = outputDictionary.OrderBy(key => key.Value).ToDictionary(pair =>   pair.Key, pair => pair.Value);

方法 2:

  foreach (KeyValuePair<String, String> item in outputDictionary.OrderBy(key => key.Value))
 {
   // do something with item.Key and item.Value
 }

方法 3:

 outputDictionary = (from entry in outputDictionary orderby entry.Value ascending   select entry).ToDictionary(pair => pair.Key, pair => pair.Value);

しかし、どの方法を選択しても、次の結果が得られます

 MyFirstValue, 1
 MyThirdValue, 10
 MySecondValue, 2
 MyFourthValue, 20
 MyFifthValue, 5

好きなところに

  MyFirstValue, 1
  MySecondValue, 2
  MyFifthValue, 5
  MyThirdValue, 10
  MyFourthValue, 20
4

3 に答える 3

10

定義上、辞書はソート可能ではありません。抽象的な意味では、要素が取得される順序についての保証はまったくありません。順序付けられた方法でアイテムをフェッチするコードがあります-私はLinqにそれほど流暢ではありませんが、あなたのコードはそうしていると思います-しかし、そのデータをたくさん使用する場合、これはすでに持っているよりも効率的ではありません反復可能なソートされた構造。のような他のタイプまたはタイプのセットを使用することをお勧めしList<KeyValuePair<string, string>>ます。

KeyValuePairまた、整数のいずれかの要素(つまり: KeyValuePair<string, int>) を作成することもできます。これは、並べ替えの基準になるからです。文字列比較はアルファベット順です。アルファベット順では、20 が 5 よりも前に来ます。

編集: Magnusは、コメントでSortedDictionary クラスを提案しました。

于 2013-06-10T13:30:35.810 に答える
0
List<KeyValuePair<string, string>> myList = aDictionary.ToList();

myList.Sort(
    delegate(KeyValuePair<string, string> firstPair,
    KeyValuePair<string, string> nextPair)
    {
        return firstPair.Value.CompareTo(nextPair.Value);
    }
);
于 2013-06-10T13:30:34.683 に答える
0

こんにちは Pankaj これを試すことができます。「MyFirstValue」の代わりに、自由に「1º 値」に変更し、ソートされていない順序で追加しました。出力は順序付けられました。

static void Main(string[] args)
        {

            Dictionary<String, Int32> outputDictionary = new Dictionary<String, Int32>();
            outputDictionary.Add("3º value", 1);
            outputDictionary.Add("2º value", 2);
            outputDictionary.Add("1º value", 10);
            outputDictionary.Add("5º value", 20);
            outputDictionary.Add("4º value", 5);
            outputDictionary.Add("14º value", 8);
            outputDictionary.Add("10º value", 22);

            IOrderedEnumerable<KeyValuePair<string,int>> NewOrder = outputDictionary.OrderBy(k => int.Parse(Regex.Match(k.Key, @"\d+").Value));

            foreach (var item in NewOrder)
            {
                Console.WriteLine(item.Key + " " + item.Value.ToString());
            }
            Console.ReadKey();
        }
于 2013-06-10T14:26:53.440 に答える