C#のList<T>は、動的にサイズを変更できる便利なコレクションであり、データの追加・削除・取得・並び替えなど多くの操作を直感的に行えます。
本記事では、C#のList<T>の基本的な使い方から、応用的な操作までを詳しく解説します。
目次
1.C#のListとは?
C#のList<T>は、ジェネリクス(Generics)を活用した動的配列の1種です。通常の配列(T[])とは異なり、要素の追加・削除が容易で、サイズの変更も自動で行われるという特徴を持っています。
C#のList<T>は、以下のように定義されます。
List<int> numbers = new List<int>(); // 整数型のListを定義 |
なぜC#のListが重要なのか?
C#のプログラミングにおいて、List<T>は以下のような理由で非常に重要です。
動的なサイズ変更が可能
配列(T[])は、一度サイズを決めると変更できません。しかし、List<T>は要素の追加や削除に応じて自動的にサイズを調整するため、柔軟なデータ管理が可能です。
List<int> numbers = new List<int> { 1, 2, 3 }; numbers.Add(4); // 4を追加 Console.WriteLine(numbers.Count); // 出力: 4 |
豊富なメソッドを提供
List<T>には、データを操作するための便利なメソッドが多数用意されています。
メソッド | 説明 |
---|---|
Add(T item) | 要素を追加 |
Remove(T item) | 指定した要素を削除 |
Count | リストの要素数を取得 |
Sort() | リストを昇順に並び替え |
Reverse() | リストの要素を逆順にする |
Contains(T item) | 指定した要素が含まれているか判定 |
配列よりも直感的に扱いやすい
配列は固定長であり、サイズ変更のたびに新しい配列を作成する必要があります。しかし、List<T>ならデータ追加・削除がシンプルなメソッドで可能です。
// 配列の場合
// 新しい要素を追加するには、新しい配列を作成しコピーする必要がある int[] newNumbers = new int[4]; Array.Copy(arrayNumbers, newNumbers, arrayNumbers.Length); newNumbers[3] = 4;
listNumbers.Add(4); // サイズを気にせず追加できる |
C#のListと配列の違い
基本的に、データ量が事前に決まっていて変更不要なら配列を使用し、可変サイズで管理したいならList<T>を使用するのがベストです。
項目 | List<T> | 配列(T[]) |
---|---|---|
サイズ変更 | 自動で拡張/縮小 | 固定サイズ |
追加/削除 | Add()、Remove()で簡単に可能 | 直接不可(新しい配列の作成が必要) |
検索 | Contains()、Find()で検索可能 | forやArray.IndexOf()が必要 |
並び替え | Sort()で可能 | Array.Sort()を利用 |
メモリ効率 | 若干オーバーヘッドあり | メモリ使用量が少ない |
2.C#のListの基本
C#のList<T>を活用するには、正しい初期化方法と型指定を理解することが重要です。本章では、List<T>の基本的な初期化方法・型指定の方法・型を指定しないリストの扱い方について詳しく解説します。
C# Listの初期化方法
C#のList<T>は柔軟にデータを管理できる強力なコレクションですが、その初期化方法を適切に選ぶことで、コードの可読性やパフォーマンスを大きく向上させることができます。
空のListを作成
何も要素を持たない状態でリストを作成する場合は下記のように記述します。
List<int> numbers = new List<int>(); |
この状態ではCount(要素数)は0です。
初期値を持つListを作成
List<T>には初期値を設定可能です。
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; List<string> names = new List<string> { "Alice", "Bob", "Charlie" }; |
この場合、リストは初期値を持つ状態で作成されます。
配列からListを作成
既存の配列をリストに変換する方法は下記のように記述します。
int[] array = { 1, 2, 3, 4, 5 }; List<int> numbers = new List<int>(array); |
C#のListの型指定なしの扱い方
通常List<T>は型を指定しますが、C#では型を指定しないリスト(非ジェネリックリスト)も可能です。
object型のList
List<object>を使うと、異なる型のデータを1つのリストに格納できます。
List<object> mixedList = new List<object> { 1, "Hello", 3.14, true };
{ Console.WriteLine($"{item} ({item.GetType()})"); } |
ArrayListを使う
ArrayListは型を指定しないリストとして利用可能ですが、型安全性が低いため推奨されません。
using System.Collections;
arrayList.Add(1); arrayList.Add("Hello"); arrayList.Add(3.14);
{ Console.WriteLine($"{item} ({item.GetType()})"); } |
ArrayListはボクシング(Boxing)・アンボクシング(Unboxing)が発生するため、パフォーマンスが悪くなる可能性があります。推奨されるのはList<object>の使用です。
2次元配列とListの比較
C#では、2次元のデータを扱う方法として、2次元配列(T[,])とリストのリスト(List<List<T>>)の2つの選択肢があります。
2次元配列
int[,] matrix = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; |
この方法は、固定サイズのデータには向いていますが、行ごとに異なる要素数を持つデータには不向きです。
Listのリスト
List<List<int>> jaggedList = new List<List<int>> { new List<int> { 1, 2, 3 }, new List<int> { 4, 5 }, new List<int> { 6, 7, 8, 9 } }; |
この方法は、可変長のデータ(行ごとに異なる要素数を持つデータ)を扱うのに適しています。
C# Listのキャパシティ設定
List<T>は内部的に配列を使用して要素を管理しており、要素が追加されると容量が自動で拡張されます。しかし、大量のデータを扱う場合は、事前に容量(Capacity)を設定するとパフォーマンスが向上します。
List<int> numbers = new List<int>(1000); // 1000個分の容量を確保 |
これにより、リストの拡張が発生する回数を減らし、メモリ効率を改善できます。
関連記事
C#とは?基本文法や特徴、メリット、開発分野まで初心者に必要な情報をわかりやすく解説
3.C#のListの基本操作|要素の追加・取得・削除・カウント
C#のList<T>は、柔軟なデータ操作を可能にする強力なコレクションです。本章では、要素の追加・取得・削除・要素数の取得方法を詳しく解説します。
Listへの要素の追加
C#のList<T>では、要素を簡単に追加できます。主な方法は以下の2つです。
Add()を使用した単一要素の追加
List<int> numbers = new List<int>(); numbers.Add(10); numbers.Add(20); numbers.Add(30);
|
AddRange()を使用した複数要素の追加
複数の要素を一度に追加したい場合は、AddRange()を使用します。
List<int> numbers = new List<int> { 1, 2, 3 }; numbers.AddRange(new int[] { 4, 5, 6 });
|
Listから要素を取得する
C#のList<T>を活用する上で、特定の要素を取得する方法を理解することは非常に重要です。List<T>にはインデックスを指定した取得・条件に一致する要素の検索・リスト内の要素の存在チェックなど、さまざまな取得方法が用意されています。
インデックスを指定して取得
List<T>の各要素はインデックス(0から始まる番号)でアクセスできます。
List<string> names = new List<string> { "Alice", "Bob", "Charlie" }; Console.WriteLine(names[0]); // 出力: Alice Console.WriteLine(names[1]); // 出力: Bob |
Find()を使用して特定の要素を取得
Find()を使うと、条件に一致する最初の要素を取得できます。
List<int> numbers = new List<int> { 10, 20, 30, 40, 50 }; int result = numbers.Find(n => n > 25); Console.WriteLine(result); // 出力: 30 |
FindAll()を使用して複数の要素を取得
複数の要素を取得するには、FindAll()を使用します。
List<int> numbers = new List<int> { 10, 20, 30, 40, 50 }; List<int> results = numbers.FindAll(n => n > 25);
|
Listから要素を削除する
C#のList<T>では、不要なデータを適切に削除することで、メモリ管理やパフォーマンスを最適化できます。Remove()・RemoveAt()・RemoveAll()・Clear()など、用途に応じた削除方法が用意されており、それぞれの使い方を理解することが重要です。
Remove()を使用した要素の削除
Remove() は指定した値を削除します。
List<int> numbers = new List<int> { 10, 20, 30, 40 }; numbers.Remove(20);
|
RemoveAt()を使用した特定インデックスの削除
特定のインデックスを削除する場合は、RemoveAt()を使用します。
List<int> numbers = new List<int> { 10, 20, 30, 40 }; numbers.RemoveAt(2);
|
RemoveAll()を使用した条件に一致する要素の削除
条件に一致した要素のみを削除したい場合は、RemoveAll()を使用します。
List<int> numbers = new List<int> { 10, 20, 30, 40, 50 }; numbers.RemoveAll(n => n > 25);
|
Clear()を使用した全要素の削除
Clear()を使用すると、リストの全要素を削除されます。
List<int> numbers = new List<int> { 10, 20, 30 }; numbers.Clear();
|
Listの要素数を取得する
C#のList<T>の要素数(サイズ)を取得するには、Countプロパティを使用します。
List<string> names = new List<string> { "Alice", "Bob", "Charlie" }; Console.WriteLine(names.Count); // 出力: 3 |
Listのループ処理
C#のList<T>を扱う際、リスト内の全要素に対して処理を実行するループ処理は欠かせません。例えば、データの表示・計算処理・条件によるフィルタリングなど、さまざまな用途で活用されます。ここでは、2つのループ処理の方法について解説します。
foreachループを使う
foreachはリストの全要素をシンプルに処理する場合に便利です。
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; foreach (int num in numbers) { Console.WriteLine(num); } |
forループを使う
forはインデックスを操作する場合に便利です。
for (int i = 0; i < numbers.Count; i++) { Console.WriteLine(numbers[i]); } |
4.C# Listの応用操作|並び替え・変換・検索
C#のList<T>は基本的な追加・削除・取得以外にも、並び替え・データ変換など、より高度な操作が可能です。本章では、Listの応用的な使い方を詳しく解説します。
Listの並び替え(ソート)
C#のList<T>には、要素を並び替えるための便利なメソッドが用意されています。
Sort()を使用した昇順ソート
Sort()を使うと、リストの要素を昇順に並び替えることができます。
List<int> numbers = new List<int> { 5, 2, 8, 3, 1 }; numbers.Sort();
|
Sort() + Comparison<T>を使用したカスタムソート
降順にソートする場合は、Comparison<T> を指定します。
numbers.Sort((a, b) => b.CompareTo(a));
|
OrderBy()とOrderByDescending()を使用したLINQソート
LINQを利用すると、可読性の高いソートが可能です。
List<int> numbers = new List<int> { 5, 2, 8, 3, 1 };
var sortedAsc = numbers.OrderBy(n => n).ToList(); Console.WriteLine(string.Join(", ", sortedAsc)); // 出力: 1, 2, 3, 5, 8
var sortedDesc = numbers.OrderByDescending(n => n).ToList(); Console.WriteLine(string.Join(", ", sortedDesc)); // 出力: 8, 5, 3, 2, 1 |
Listのデータ変換
C#のList<T>は、他のデータ構造(配列・文字列・辞書など)へ変換できます。
Listを配列に変換
ToArray()を使用すると、Listを配列に変換できます。
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; int[] array = numbers.ToArray(); Console.WriteLine(string.Join(", ", array)); // 出力: 1, 2, 3, 4, 5 |
配列をListに変換
配列からListを作成するには、ToList()を使用します。
int[] array = { 1, 2, 3, 4, 5 }; List<int> numbers = array.ToList(); Console.WriteLine(string.Join(", ", numbers)); // 出力: 1, 2, 3, 4, 5 |
Listを文字列に変換
リストの要素をカンマ区切りの文字列として出力する場合、string.Join()を使用できます。
List<string> names = new List<string> { "Alice", "Bob", "Charlie" }; string result = string.Join(", ", names); Console.WriteLine(result); // 出力: Alice, Bob, Charlie |
Listの検索とフィルタリング
C#のList<T>を活用する際、特定の条件に合致する要素を効率的に検索・フィルタリングすることは非常に重要です。Contains()を使った要素の存在確認・Find()を使った特定の要素の検索・FindAll()を使った複数要素の取得など、C#にはさまざまな検索・フィルタリングメソッドが用意されています。
Contains()を使用した要素の存在確認
Contains(T item)は、リスト内に指定の値が存在するかを確認するメソッドです。
List<string> names = new List<string> { "Alice", "Bob", "Charlie" }; bool exists = names.Contains("Bob"); Console.WriteLine(exists); // 出力: True |
Find()を使用した特定要素の検索
Find(Predicate<T> match)は条件に一致する最初の要素を返します。
List<int> numbers = new List<int> { 10, 20, 30, 40, 50 }; int found = numbers.Find(n => n > 25); Console.WriteLine(found); // 出力: 30 |
FindAll()を使用した複数要素の検索
FindAll()は条件に一致する全ての要素をリストで取得します。
List<int> numbers = new List<int> { 10, 20, 30, 40, 50 }; List<int> results = numbers.FindAll(n => n > 25); Console.WriteLine(string.Join(", ", results)); // 出力: 30, 40, 50 |
関連記事
C#の案件の実情|単価って?稼ぐ方法ある?必要スキルや業務内容など紹介
5.まとめ
C#のList<T>は、サイズの動的変更が可能で要素の追加・削除が簡単に行えるコレクションです。配列と比較すると柔軟性が高く、豊富なメソッドが用意されているため、データの操作が効率的に行えます。
基本的な初期化方法から、要素の取得・削除・ループ処理・並び替え・検索・変換まで、多様なシナリオに対応できるため、適切な方法を選択することが重要です。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。