2014/10/25

【C#】配列やリスト(List)のソート処理5種

とりあえずデータを配列やListに突っ込んで、後でソートしたいときのいろんな方法をまとめる。
  • Arrayクラスを使う場合
  • Listクラスを使う場合
  • LINQを使う場合
  • SortedListやSortedDictionaryを使う場合



Arrayクラスを使う場合


// 数値型配列
var numArray = new[] { 5, 2, 4, 3, 1 };
// 文字型配列
var strArray = new[] { "C", "S", "h", "a", "r", "p" };

// 昇順にソート
Array.Sort(numArray);
Array.Sort(strArray);

// 表示:1, 2, 3, 4, 5
foreach (var n in numArray) Console.WriteLine(n);
// 表示:a, C, h, p, r, s
foreach (var s in strArray) Console.WriteLine(s);

// 降順にソート
Array.Reverse(numArray);
Array.Reverse(strArray);

// 表示:5, 4, 3, 2, 1
foreach (var n in numArray) Console.WriteLine(n);
// 表示:s, r, p, h, C, a
foreach (var s in strArray) Console.WriteLine(s);


注意点としては、「Array.Sort」は配列の並びを書き換えてしまうので、元の並び順が保持されない。
また、降順にソートする「Array.Reverse」は、昇順にソートされた配列でないとうまく並び替わらない。



Listクラスを使う場合


// 数値型リスト
var numList = new List<int>(new int[] { 5, 2, 4, 3, 1 });
// 文字型リスト
var strList = new List<string>(new string[] { "C", "S", "h", "a", "r", "p" });

// 昇順にソート
numList.Sort();
strList.Sort();

// 表示:1, 2, 3, 4, 5
foreach (var n in numList) Console.WriteLine(n);
// 表示:a, C, h, p, r, s
foreach (var s in strList) Console.WriteLine(s);

// 降順にソート
numList.Reverse();
strList.Reverse();

// 表示:5, 4, 3, 2, 1
foreach (var n in numList) Console.WriteLine(n);
// 表示:s, r, p, h, C, a
foreach (var s in strList) Console.WriteLine(s);


注意点としては、Arrayクラスを同じ。

リストの並びを書き換えてしまうので、元の並び順が保持されない。
降順にソートする「hoge.Reverse」は、昇順にソートされたリストでないとうまく並び替わらない。

あと、これだけは言わせて欲しい。

おい、Javaer! C#にまできてArrayList使うなよ、ボケ!



LINQを使う場合


// 数値型配列
var numLinq = new[] { 5, 2, 4, 3, 1 };
// 文字型配列
var strLinq = new[] { "C", "S", "h", "a", "r", "p" };

// 昇順にソート
var numQuery1 = numLinq.OrderBy(n => n);
var strQuery1 = strLinq.OrderBy(s => s);

// 表示:1, 2, 3, 4, 5
foreach (var n in numQuery1) Console.WriteLine(n);
// 表示:a, C, h, p, r, s
foreach (var s in strQuery1) Console.WriteLine(s);

// 降順にソート
var numQuery2 = numLinq.OrderByDescending(n => n);
var strQuery2 = strLinq.OrderByDescending(s => s);

// 表示:5, 4, 3, 2, 1
foreach (var n in numQuery2) Console.WriteLine(n);
// 表示:s, r, p, h, C, a
foreach (var s in strQuery2) Console.WriteLine(s);

クエリでも書けなくないけど、やっぱりLINQ使ったほうが見栄えが良い。
しかも、ラムダ式なんかもちゃっかり使ってるから、できるプログラマっぽい気分になれる!

ArrayやListと違って配列の並びを書き換えるわけではないので、元の並びを保持したい場合は有効。



SortedListやSortedDictionaryを使う場合


SortedList

var sortedList = new SortedList<int, string>();
sortedList.Add(5, "five");
sortedList.Add(2, "two");
sortedList.Add(4, "four");
sortedList.Add(3, "three");
sortedList.Add(1, "one");

//[1, one], [2, two], [3, three], [4, four], [5, five]
foreach (var l in sortedList) Console.WriteLine(l);


SortedDictionary

var sortedDic = new SortedDictionary<string, int>();
sortedDic.Add("five", 5);
sortedDic.Add("two", 2);
sortedDic.Add("four", 4);
sortedDic.Add("three", 3);
sortedDic.Add("one", 1);

// [five, 5], [four, 4], [one, 1], [three, 3], [two, 2]
foreach (var d in sortedDic) Console.WriteLine(d);

Sortedと付いてるだけあって、この2つのクラスは自動的にソートしてくれる。
降順にする場合は、ちょいと面倒なので「ortedList Desc Order - Stack Overflow」を参照ください。



以上

written by @bc_rikko

2 件のコメント :

  1. 碌に調べない技術者もわるいが暴言まで使って他言語の特徴を貶すの人が周りを笑顔にすることできるんですかね

    返信削除
    返信
    1. コメントありがとうございます!

      おっしゃっているのは「おい、Javaer! C#にまできてArrayList使うなよ、ボケ!」の部分かと思います。
      この言葉が出てくる背景にはいろいろ複雑な事情があるのですが、いまさら何を言っても言い訳にしかなりません。

      ご指摘いただいた内容は真摯に受け止め、以後気をつけるようにいたします。

      削除