自動でソートされるリストを使う : SortedListの利用

自動でソートされるリスト(SortedList)を使うコードを紹介します。

はじめに

C#でのリストはList<T>の利用が一般的ですが、リスト内の項目をソートする目的の場合、SortedListを利用できます。 SortedList はキーに基づいて自動的に要素をソートします。リストの要素が常に順序付けられた状態で保持され、特定の順序でデータを処理する必要がある場合に便利です。 また、内部的にバイナリサーチを使用しているため、キーを使った検索が非常に高速です。大規模なデータセットでも効率的にキーを検索できる点が強みです。
この記事では、SortedListを利用するコードを紹介します。

プログラム例

UI

下図のフォームを作成します。ボタンとテキストボックスを1つずつ配置します。 テキストボックスはMultilineプロパティをtrueに設定しています。

自動でソートされるリストを使う : SortedListの利用:画像1

コード

以下のコードを記述します。

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);
  }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。
自動でソートされるリストを使う : SortedListの利用:画像2

ウィンドウのボタンをクリックします。下図の結果が表示されます。MyItem の Price の値で昇順にソートされてテキストボックスに 表示できている動作が確認できます。
自動でソートされるリストを使う : SortedListの利用:画像3

SortedList を利用して、指定したキーの値で自動的にソートされるリストを作成できました。

まとめ

この記事では、C#におけるSortedListの活用方法について詳しく解説しました。 一般的にList<T>がよく使用されますが、SortedListを利用することで、キーに基づいて自動的に要素がソートされ、常に順序付けられた状態でデータを保持できます。 特に、大規模なデータセットに対して高速なキー検索が可能であり、効率的なデータ処理が求められる場合に有用です。 具体的なプログラムを紹介して、SortedListのインスタンス作成、要素の追加、表示方法について実践的に紹介しました。 実行結果では、priceをキーとして昇順にソートされたデータが正しく表示されることが確認でき、SortedListの利便性と効果を紹介しました。 開発者はデータの順序管理を容易に行い、より効率的なアプリケーション開発が可能となります。

編集後記

この記事を通じて、私がC#のSortedListの有用性とその実装方法を丁寧に紹介できたことに大変満足しています。 私たちがインターネットサービス開発や金融系分析システムの構築に携わる中で、データの効率的な管理と高速な検索は常に重要な課題となります。 SortedListを活用することで、あなたがキーに基づいた自動ソートを実現し、大規模なデータセットでもスムーズに処理できる点が非常に有益であると感じています。 具体的なコード例と実行結果を示すことで、あなたが実践的に理解しやすい内容となったと考えています。 また、私たちがシステム設計やプロジェクトマネジメントの観点からも、データの整然とした管理がプロジェクトの成功に直結するため、 今回の解説があなたの役に立てば嬉しく思います。
今後も私が最新技術の研究を続けつつ、あなたにとって実務に直結する有益な情報を提供していきたいと考えています。


AuthorPortraitAlt
著者
現在、インターネット系サービスの開発を中心に活動しているソフトウェアエンジニアです。

大学では情報工学を専攻し、プログラミングやシステム設計の基礎から応用まで幅広く学びました。 卒業後は、主にインターネットサービスの開発プロジェクトに携わり、ユーザー体験の向上やシステムの最適化に従事しました。 また、金融業界向けの分析システム構築にも深く関わり、データ解析やアルゴリズムの開発を通じて、業務効率化と意思決定支援に貢献しています。

技術力だけでなくチームとのコミュニケーションやプロジェクトマネジメント能力の向上にも取り組んでいます。 常に最新の技術動向をキャッチアップし、柔軟かつ創造的な解決策を提案することを心がけています。 エンジニアとしての魅力と誠実さを大切にし、職場でも信頼される存在でありたいと考えています。

今後も、技術の進化に対応しながら、より良いサービスの提供とシステムの開発に邁進していけたらいいなと思います。
作成日: 2024-12-24
Copyright © 1995–2025 iPentec all rights reserverd.