C# PR

【C#】SortedListで昇順にソートされたリストを簡単に作る

【C#】SortedListで昇順にソートされたリストを簡単に作る
記事内に商品プロモーションを含む場合があります

こんにちは!
今日はC#のSortedListについて詳しく見ていきましょう。
SortedListは、要素を追加する際に自動的にソートされる便利なコレクションです。
これにより、順序付けられたデータを効率的に管理でき、キーに基づいて高速な検索が可能になります。

この記事では、SortedListの基本的な使い方から、実際にプログラムでどのように動作させるかまで、具体的な例を交えて解説していきます。
初心者の方にも理解しやすいように、基本からしっかりと説明するので、最後までご覧いただけると嬉しいです。

SortedListとは

SortedListとは、C#で提供されているコレクションの一つで、キーと値のペアを要素として持ちます。
このコレクションの大きな特徴は、要素が自動的にキーに基づいてソートされることです。
つまり、要素を追加するたびに、それらがキーの順番に従って整理されるため、データの取り出しが非常に高速になります。


var sortedList = new SortedList<int, string>();
sortedList.Add(3, "りんご");
sortedList.Add(1, "ばなな");
sortedList.Add(2, "みかん");

foreach (var item in sortedList)
{
	Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
}
結果

Key: 1, Value: ばなな
Key: 2, Value: みかん
Key: 3, Value: りんご

SortedListは内部的には二分探索木を用いており、キーに基づくアクセス、検索、削除が効率的に行えるようになっています。
これにより、中規模から大規模なデータセットでの作業でも、パフォーマンスの低下が少ないのが特徴です。

また、SortedListList<T>Dictionary<K,V>といった他のコレクションとは異なり、常に順序が保たれるため、順序を重視するアプリケーションに最適です。

「二分探索木」とは(補足)

「二分探索木」とは、データを効率的に管理するためのデータ構造の一種です。
この木構造では、各ノードが子ノードを最大で二つ持つことができ、それぞれが「左の子ノード」と「右の子ノード」と呼ばれます。

この構造の便利な点は、各ノードの左の子にあるデータは親ノードのデータよりも常に小さく、右の子にあるデータは親ノードのデータよりも大きいというルールに基づいていることです。
これにより、データの検索や挿入、削除が非常に高速に行えるようになります。

例えば、以下の簡単なサンプルコードは、二分探索木を使ってデータを挿入し、そのデータを探索する方法を示しています。


using System;
using System.Collections.Generic;

class BinarySearchTree
{
	public int Value { get; set; }
	public BinarySearchTree Left { get; set; }
	public BinarySearchTree Right { get; set; }

	public BinarySearchTree(int value)
	{
		this.Value = value;
	}

	public void Insert(int newValue)
	{
		if (newValue < this.Value)
		{
			if (this.Left == null)
			this.Left = new BinarySearchTree(newValue);
			else
			this.Left.Insert(newValue);
		}
		else
		{
			if (this.Right == null)
			this.Right = new BinarySearchTree(newValue);
			else
			this.Right.Insert(newValue);
		}
	}

	public bool Contains(int value)
	{
		if (value == this.Value)
		return true;
		else if (value < this.Value)
		return this.Left != null && this.Left.Contains(value);
		else
		return this.Right != null && this.Right.Contains(value);
	}
}

class Program
{
	static void Main()
	{
		var bst = new BinarySearchTree(50);
		bst.Insert(30);
		bst.Insert(70);
		bst.Insert(20);
		bst.Insert(40);
		bst.Insert(80);
		bst.Insert(90);

		Console.WriteLine("Contains 30: " + bst.Contains(30)); // True
		Console.WriteLine("Contains 60: " + bst.Contains(60)); // False
	}
}

このコードでは、最初に50を根とする二分探索木を作成し、その後さまざまな数値を挿入しています。
Containsメソッドを使用して、特定の値が木に存在するかどうかを確認することも可能です。

【超簡単】C#のSortedListで自動的にソートされるリストを作る

基本的なSortedListの使い方

SortedListの作成

実際にいくつかのキーと値のペアを持つSortedListのインスタンスを作成してみましょう。
以下のサンプルコードでは、初期データを持つSortedListを作成しています。


using System;
using System.Collections;

class Program
{
	static void Main()
	{
		// SortedListのインスタンスを作成し、初期データを持たせます
		var sortedList = new SortedList
		{
			{ "apple", 1 },
			{ "orange", 2 },
			{ "banana", 3 },
		};

		foreach (DictionaryEntry entry in sortedList)
		{
			Console.WriteLine($"キー: {entry.Key}, 値: {entry.Value}");
		}
	}
}
結果

キー: apple, 値: 1
キー: banana, 値: 3
キー: orange, 値: 2

このコードでは、SortedListに4つのフルーツとそれぞれの数量をペアとして追加しています。
SortedListの特性として、これらのキーは自動的にソートされるため、出力はアルファベット順に並びます。

実行すると、SortedList内のアイテムがキーに従ってソートされた状態で出力されるので、データの検索やアクセスが非常に効率的です。

値の取得

キーでの取得

SortedListから特定のキーを使って値を取得する方法は、非常に直感的で使いやすいですね。
キーを指定するだけで、関連付けられた値を簡単に取得できます。

以下のサンプルコードを見てみましょう。ここでは、SortedListから特定のキーを使って値を取得しています。


using System;
using System.Collections;

class Program
{
	static void Main()
	{
		var sortedList = new SortedList
		{
			{ "apple", 1 },
			{ "orange", 2 },
			{ "banana", 3 }
		};

		if (sortedList.ContainsKey("banana"))
		{
			Console.WriteLine("bananaの値: " + sortedList["banana"]);  // 3
		}
		else
		{
			Console.WriteLine("bananaというキーは存在しません。");
		}
	}
}
結果

bananaの値: 3

このコードでは、まずContainsKeyメソッドを使用して指定されたキーがSortedListに存在するかどうかを確認しています。
キーが存在すれば、そのキーをインデックスとして使用して値を取得します。
このプロセスにより、例外を防ぎつつ、必要なデータを確実に取得できるため、非常に便利です。

foreachでの取得

SortedListの要素を効率的に取得するもう一つの方法は、foreachループを使用することです。
この方法では、SortedList内のすべてのキーと値のペアを順番にアクセスし、必要な処理を行うことができます。

以下のサンプルコードでは、SortedList内のすべての要素をforeachループを使って取得し、コンソールに出力する方法を示しています。


using System;
using System.Collections;

class Program
{
	static void Main()
	{
		var sortedList = new SortedList
		{
			{ "apple", 1 },
			{ "orange", 2 },
			{ "banana", 3 }
		};

		foreach (DictionaryEntry item in sortedList)
		{
			Console.WriteLine($"キー: {item.Key}, 値: {item.Value}");
		}
	}
}

このコードでは、SortedListの各アイテムに対してループを行い、そのキーと値をコンソールに表示しています。
この方法は、リストの内容を一覧表示する際や、特定の条件に基づいてデータを処理する際に特に有用です。

SortedListをHashtableでイテレート(反復処理)する際に、DictionaryEntry型が利用されるのは、SortedListの内部実装が従来のHashtableクラスと同様の方式を採用しているためです。

Hashtableは、キーと値のペアをDictionaryEntry構造体として格納します。
SortedListもこのDictionaryEntryを内部的に利用しているため、foreachでイテレートする際もDictionaryEntry型となります。

値の追加

SortedListに要素を追加するのは非常にシンプルですが、その動作を理解することが重要です。
キーと値のペアをSortedListに追加するとき、それぞれのキーはユニークでなければならず、自動的にソートされます。

以下のサンプルコードでは、SortedListに新しいキーと値のペアを追加する方法を示しています。


using System;
using System.Collections;

class Program
{
	static void Main()
	{
		var sortedList = new SortedList();

		// 値を追加します
		sortedList.Add("apple", 1);
		sortedList.Add("orange", 2);
		sortedList.Add("banana", 3);

		foreach (DictionaryEntry item in sortedList)
		{
			Console.WriteLine($"キー: {item.Key}, 値: {item.Value}");
		}
	}
}
結果

キー: apple, 値: 1
キー: banana, 値: 3
キー: orange, 値: 2

このコードを実行すると、各アイテムがキーに基づいてソートされた状態でSortedListに追加されるのが分かります。
また、もし既に存在するキーで追加しようとすると、ArgumentExceptionが発生しますので注意が必要です。

値の更新

SortedList内のデータを更新するには、既存のキーを使って新しい値を割り当てることで行えます。
これにより、簡単に値を変更することが可能です。

以下のサンプルコードでは、SortedListに保存されている既存の値を更新する方法を示しています。


using System;
using System.Collections;

class Program
{
	static void Main()
	{
		var sortedList = new SortedList
		{
			{ "apple", 1 },
			{ "orange", 2 },
			{ "banana", 3 }
		};

		// "orange"の値を更新します
		if (sortedList.ContainsKey("orange"))
		{
			sortedList["orange"] = 5;
			Console.WriteLine("orangeの値が更新されました。新しい値: " + sortedList["orange"]);  // 新しい値: 5
		}
		else
		{
			Console.WriteLine("更新しようとしたキーが存在しません。");
		}
	}
}

このコードでは、まずキー"orange"SortedList内に存在するかを確認しています。
存在していれば、そのキーの値を新しい値で更新しています。

値の削除

SortedListから特定のキーとその値を削除する方法も、非常に簡単です。
不要なデータを取り除くことで、リストを整理し、管理を容易にすることができます。

以下のサンプルコードでは、SortedListから指定したキーに関連付けられた値を削除する方法を示しています。


using System;
using System.Collections;

class Program
{
	static void Main()
	{
		var sortedList = new SortedList
		{
			{ "apple", 1 },
			{ "orange", 2 },
			{ "banana", 3 }
		};

		// "banana"のキーと値を削除します
		if (sortedList.ContainsKey("banana"))
		{
			sortedList.Remove("banana");
			Console.WriteLine("bananaが削除されました。");
		}
		else
		{
			Console.WriteLine("削除しようとしたキーが存在しません。");
		}

		// 削除後のSortedListの内容を表示します
		Console.WriteLine("現在のSortedListの内容:");
		foreach (DictionaryEntry item in sortedList)
		{
			Console.WriteLine($"キー: {item.Key}, 値: {item.Value}");
		}
	}
}

このコードでは、まず削除したいキー”banana”がSortedListに存在するかを確認しています。
キーが存在すれば、そのキーを使用してSortedListからアイテムを削除します。

キャリア形成/給与還元
ひとつひとつ真摯に向き合う企業
ONE_WEDGE社員募集

株式会社 ONE WEDGEでは、新たな仲間を募集しています!

私たちと一緒に、革新的で充実したキャリアを築きませんか?
当社は、従業員が仕事と私生活のバランスを大切にできるよう、充実した福利厚生を整えています。

  • 完全週休2日制(土日休み)で、祝日や夏季休暇、年末年始休暇もしっかり保証!
  • 様々な休暇制度(有給、慶弔、産前・産後、育児、バースデー休暇)を完備!
  • 従業員の成長と健康を支援するための表彰制度、資格取得支援、健康促進手当など!
  • 生活を支えるテレワーク手当、記事寄稿手当、結婚祝金・出産祝金など、様々な手当を提供!
  • 自己啓発としての書籍購入制度や、メンバー間のコミュニケーションを深める交流費補助!
  • 成果に応じた決算賞与や、リファラル採用手当、AI手当など、頑張りをしっかり評価!
  • ワークライフバランスを重視し、副業もOK!

株式会社 ONE WEDGEでは、一人ひとりの従業員が自己実現できる環境を大切にしています。
共に成長し、刺激を与え合える仲間をお待ちしております。
あなたの能力と熱意を、ぜひ当社で発揮してください。
ご応募お待ちしております!

ホームページ、採用情報は下記ボタンからご確認ください!

応募、ご質問など、LINEでお気軽にご相談ください♪

まとめ

これで、C#のSortedListに関する基本的な使い方から、具体的な操作方法について学ぶことができました。
SortedListはキーに基づいて自動的に要素がソートされるため、効率的なデータ管理が可能です。
この記事を通じて、SortedListの作成、値の追加や取得、更新、削除までの一連の流れを確認してきました。

特に、SortedListはキーと値のペアを扱う際に、その順序を保ちながら迅速にアクセスする必要があるアプリケーションで非常に役立ちます。
また、データの検索や更新、削除が簡単にできることから、多くのプログラミングシナリオで有効に活用することができるでしょう。

今後もこのようなデータ構造を活用して、より複雑な問題を効率的に解決できるように練習を重ねていくことが大切です。
また、他のコレクションとの比較を行いながら、最適なツールを選択する力も身につけてください。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です