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

0 件のコメント :

コメントを投稿