自動でソートされるリスト(SortedList)を使うコードを紹介します。
C#でのリストはList<T>
の利用が一般的ですが、リスト内の項目をソートする目的の場合、SortedListを利用できます。
SortedList はキーに基づいて自動的に要素をソートします。リストの要素が常に順序付けられた状態で保持され、特定の順序でデータを処理する必要がある場合に便利です。
また、内部的にバイナリサーチを使用しているため、キーを使った検索が非常に高速です。大規模なデータセットでも効率的にキーを検索できる点が強みです。
この記事では、SortedListを利用するコードを紹介します。
下図のフォームを作成します。ボタンとテキストボックスを1つずつ配置します。
テキストボックスはMultilineプロパティをtrueに設定しています。
以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SortedListDemo
{
public partial class FormSimpleSortedList : Form
{
public class MyItem {
public int id;
public int price;
public decimal Weight;
public string Name="";
}
public FormSimpleSortedList()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SortedList<int, MyItem> sList = new SortedList<int, MyItem>();
MyItem m;
m = new MyItem() { id = 1, Name = "ぺんぎんクッキー", price = 360, Weight = 18.5m };
sList.Add(m.price,m);
m = new MyItem() { id = 2, Name = "らくだキャラメル", price = 120, Weight = 4.5m };
sList.Add(m.price, m);
m = new MyItem() { id = 3, Name = "しろくまアイス", price = 280, Weight = 20.2m };
sList.Add(m.price, m);
m = new MyItem() { id = 4, Name = "あるぱかカステラ", price = 420, Weight = 40.2m };
sList.Add(m.price, m);
m = new MyItem() { id = 5, Name = "あざらしロールケーキ", price = 580, Weight = 124.0m };
sList.Add(m.price, m);
m = new MyItem() { id = 6, Name = "うさぎキャンディ", price = 130, Weight = 5.2m };
sList.Add(m.price, m);
m = new MyItem() { id = 7, Name = "いるかラムネ", price = 210, Weight = 8.5m };
sList.Add(m.price, m);
m = new MyItem() { id = 8, Name = "かるがもサブレ", price = 320, Weight = 14.8m };
sList.Add(m.price, m);
textBox1.Text += "id,Name,Weight,Price";
foreach (MyItem tm in sList.Values) {
textBox1.Text += string.Format("{0:d},{1},{2:f},{3:d}\r\n", tm.id, tm.Name, tm.Weight, tm.price);
}
//forループを利用する場合は以下のコードになります。
/*
for (int i=0; i<sList.Count; i++) {
textBox1.Text += string.Format("{0:d},{1},{2:f},{3:d}\r\n", sList.Values[i].id, sList.Values[i].Name, sList.Values[i].Weight, sList.Values[i].price);
}
*/
}
}
}
SortedListのインスタンスを作成します。今回はソートのキーはint型としリストに格納する型をMyItem型としています。
SortedList<int, MyItem> sList = new SortedList<int, MyItem>();
以下のコードでは、SortedListにMyItemオブジェクトを挿入します。
Addメソッドの最初の引数はソートに利用する値です。今回は、MyItemオブジェクトのpriceの値でソートする動作にしています。
MyItem m;
m = new MyItem() { id = 1, Name = "ぺんぎんクッキー", price = 360, Weight = 18.5m };
sList.Add(m.price,m);
m = new MyItem() { id = 2, Name = "らくだキャラメル", price = 120, Weight = 4.5m };
sList.Add(m.price, m);
m = new MyItem() { id = 3, Name = "しろくまアイス", price = 280, Weight = 20.2m };
sList.Add(m.price, m);
m = new MyItem() { id = 4, Name = "あるぱかカステラ", price = 420, Weight = 40.2m };
sList.Add(m.price, m);
m = new MyItem() { id = 5, Name = "あざらしロールケーキ", price = 580, Weight = 124.0m };
sList.Add(m.price, m);
m = new MyItem() { id = 6, Name = "うさぎキャンディ", price = 130, Weight = 5.2m };
sList.Add(m.price, m);
m = new MyItem() { id = 7, Name = "いるかラムネ", price = 210, Weight = 8.5m };
sList.Add(m.price, m);
m = new MyItem() { id = 8, Name = "かるがもサブレ", price = 320, Weight = 14.8m };
sList.Add(m.price, m);
コレクション初期化子を利用して以下の記述でも良いです。
この方法では、キーの値が直接の値入力となってしまうため、あまり良くない記述と感じるかもしれません。
SortedList<int, MyItem> sList = new SortedList<int, MyItem>
{
{360, new MyItem { id = 1, Name = "ぺんぎんクッキー", price = 360, Weight = 18.5m }},
{120, new MyItem { id = 2, Name = "らくだキャラメル", price = 120, Weight = 4.5m }},
{280, new MyItem { id = 3, Name = "しろくまアイス", price = 280, Weight = 20.2m }},
{420, new MyItem { id = 4, Name = "あるぱかカステラ", price = 420, Weight = 40.2m }},
{580, new MyItem { id = 5, Name = "あざらしロールケーキ", price = 580, Weight = 124.0m }},
{130, new MyItem { id = 6, Name = "うさぎキャンディ", price = 130, Weight = 5.2m }},
{210, new MyItem { id = 7, Name = "いるかラムネ", price = 210, Weight = 8.5m }},
{320, new MyItem { id = 8, Name = "かるがもサブレ", price = 320, Weight = 14.8m }}
};
MyItem.priceの値を参照するコードにしたい場合は、以下の記述もできます。
List<MyItem>を作成し、SortedListのコンストラクタの引数にDictionaryを与える方法で作成します。
List<MyItem> items = new List<MyItem>
{
new MyItem { id = 1, Name = "ぺんぎんクッキー", price = 360, Weight = 18.5m },
new MyItem { id = 2, Name = "らくだキャラメル", price = 120, Weight = 4.5m },
new MyItem { id = 3, Name = "しろくまアイス", price = 280, Weight = 20.2m },
new MyItem { id = 4, Name = "あるぱかカステラ", price = 420, Weight = 40.2m },
new MyItem { id = 5, Name = "あざらしロールケーキ", price = 580, Weight = 124.0m },
new MyItem { id = 6, Name = "うさぎキャンディ", price = 130, Weight = 5.2m },
new MyItem { id = 7, Name = "いるかラムネ", price = 210, Weight = 8.5m },
new MyItem { id = 8, Name = "かるがもサブレ", price = 320, Weight = 14.8m }
};
SortedList<int, MyItem> sList = new SortedList<int, MyItem>(
items.ToDictionary(item => item.price)
);
SortedListの値を画面に表示します。foreachループでSortedListの要素を表示します。要素をリスト的に取得する場合は、SortedList.Values を参照します。
foreach (MyItem tm in sList.Values) {
textBox1.Text += string.Format("{0:d},{1},{2:f},{3:d}\r\n", tm.id, tm.Name, tm.Weight, tm.price);
}
なお、forループで実装する場合は以下の記述になります。こちらも、SortedList.Valuesを参照します。
for (int i=0; i<sList.Count; i++) {
textBox1.Text += string.Format("{0:d},{1},{2:f},{3:d}\r\n", sList.Values[i].id, sList.Values[i].Name, sList.Values[i].Weight, sList.Values[i].price);
}
プロジェクトを実行します。下図のウィンドウが表示されます。
ウィンドウのボタンをクリックします。下図の結果が表示されます。MyItem の Price の値で昇順にソートされてテキストボックスに
表示できている動作が確認できます。
SortedList を利用して、指定したキーの値で自動的にソートされるリストを作成できました。
この記事では、C#におけるSortedListの活用方法について詳しく解説しました。 一般的にList<T>がよく使用されますが、SortedListを利用することで、キーに基づいて自動的に要素がソートされ、常に順序付けられた状態でデータを保持できます。 特に、大規模なデータセットに対して高速なキー検索が可能であり、効率的なデータ処理が求められる場合に有用です。 具体的なプログラムを紹介して、SortedListのインスタンス作成、要素の追加、表示方法について実践的に紹介しました。 実行結果では、priceをキーとして昇順にソートされたデータが正しく表示されることが確認でき、SortedListの利便性と効果を紹介しました。 開発者はデータの順序管理を容易に行い、より効率的なアプリケーション開発が可能となります。
この記事を通じて、私がC#のSortedList
の有用性とその実装方法を丁寧に紹介できたことに大変満足しています。
私たちがインターネットサービス開発や金融系分析システムの構築に携わる中で、データの効率的な管理と高速な検索は常に重要な課題となります。
SortedList
を活用することで、あなたがキーに基づいた自動ソートを実現し、大規模なデータセットでもスムーズに処理できる点が非常に有益であると感じています。
具体的なコード例と実行結果を示すことで、あなたが実践的に理解しやすい内容となったと考えています。
また、私たちがシステム設計やプロジェクトマネジメントの観点からも、データの整然とした管理がプロジェクトの成功に直結するため、
今回の解説があなたの役に立てば嬉しく思います。
今後も私が最新技術の研究を続けつつ、あなたにとって実務に直結する有益な情報を提供していきたいと考えています。