C#のListの使い方のサンプルです。(確認環境:Microsoft Visual Studio Community 2017)
目次
Listクラスとは
var color = new List<string>(); color.Add("red"); color.Add("blue"); Console.WriteLine(color[0]);// red |
上記はListクラスをインスタンス化して変数colorに代入しています。
この変数colorは複数の値を持てるようになります。
<>はジェネリクスです。
varキーワードを使用していて型推論が行われます。
変数colorの各値のデータ型はstringになります。
Listの変数の図
- 1つの変数で同じ型の複数の値を保持できます。
- 各項目を要素(element)といいます。
- 要素の順序をインデックス(添字)で管理します。上記図では[0]、[1]、[2]、[3]がインデックスです。
- サイズをあとから動的に変更できます。
- スレッドセーフではありません(インスタンスメンバー)。
- 以下はMicrosoftのC#のListクラスのリンクです。
https://msdn.microsoft.com/ja-jp/library/6sh2ey19(v=vs.110).aspx
要素に初期値をセットする
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a= new List<string>(){ "赤", "黄", "青" };
foreach (var b in a)
{
Console.WriteLine(b);// 赤 黄 青
}
}
}
8行目は、Listクラスをインスタンス化し、かつ初期値をセットしています。代入する変数はvarで宣言できます。
10~13行目は、foreach文で値を取得しています。
要素を指定して取得する(a[1])
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a= new List<string>();
a.Add("赤");
a.Add("黄");
a.Add("青");
Console.WriteLine(a[1]);// 黄
}
}
13行目は、インデクサー([1])で要素の位置を指定して要素を取得しています。
要素の位置は、赤=0、黄=1、青=2です。
要素をすべて取得する(for文/foreach文)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var color = new List<string>();
color.Add("赤");
color.Add("黄");
color.Add("青");
for (var i = 0; i < color.Count; i++)
{
Console.WriteLine(color[i]); // 赤 黄 青が出力される
}
foreach (var b in color)
{
Console.WriteLine(b);// 赤 黄 青が出力される
}
}
}
13行目は、for文ですべての要素を取得しています。
18行目は、foreach文ですべての要素を取得しています。
要素数が0の場合
var color = new List<string>();
foreach (var c in color)
{
Console.WriteLine(c);// 出力されない エラーにならない
}
ループ対象のオブジェクトの要素数が0の場合でforeachの処理を行った場合は、エラーにはならず、出力もされません。
指定の要素があるかを返す (Containsメソッド)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a = new List<string>();
a.Add("赤");
a.Add("黄");
a.Add("青");
if (a.Contains("青")){
Console.WriteLine("Trueです"); //Trueですと出力される
}
}
}
13行目は、Containsメソッドで指定の要素があるかを取得しています。
ある場合trueです。
インデックスを取得する(IndexOfメソッド)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a = new List<string>();
a.Add("赤");
a.Add("黄");
a.Add("青");
Console.WriteLine(a.IndexOf("黄")); // 1が出力される
}
}
13行目は、IndexOfメソッドで指定の値があるインデックスを取得します。
インデックスは0から始まります。
要素数を取得する (Countプロパティ)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a= new List<string>();
a.Add("赤");
a.Add("黄");
a.Add("青");
Console.WriteLine(a.Count);// 3
}
}
13行目は、Countプロパティで要素数を取得しています。
末尾に要素を追加する(Addメソッド)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a= new List<string>();
a.Add("赤");
a.Add("黄");
a.Add("青");
foreach (var b in a)
{
Console.WriteLine(b);// 赤 黄 青
}
}
}
8行目は、Listクラスをインスタンス化しています。
9~11行目は、Addメソッドでリストの末尾に要素を追加しています。
15~18行目は、foreach文で値を取得しています。
位置を指定して要素を追加する(Insertメソッド)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a= new List<string>();
a.Add("赤");
a.Add("黄");
a.Add("青");
a.Insert(0, "オレンジ");
foreach (var b in a)
{
Console.WriteLine(b);// オレンジ 赤 黄 青
}
}
}
13行目は、Insertメソッドでリストの位置を指定して要素を追加しています。先頭の位置は0です。
要素を置き換える(更新)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a = new List<string>();
a.Add("赤");
a.Add("黄");
a.Add("青");
a[1] = "オレンジ";
foreach (var b in a)
{
Console.WriteLine(b);// 赤 オレンジ 青
}
}
}
13行目は、インデクサー([1])で要素の位置を指定して要素を置き換えています。
要素の位置は、赤=0、黄=1、青=2です。
要素を削除する-インデックスを指定(RemoveAtメソッド)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a= new List<string>();
a.Add("赤");
a.Add("黄");
a.Add("青");
a.RemoveAt(0);
foreach (var b in a)
{
Console.WriteLine(b);// 黄 青
}
}
}
13行目は、RemoveAtメソッドでインデックスを指定して削除しています。インデックスは0から始まります。
要素を削除する-値を指定(Removeメソッド)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a = new List<string>();
a.Add("赤");
a.Add("黄");
a.Add("青");
a.Remove("黄");
foreach (var b in a)
{
Console.WriteLine(b);// 赤 青
}
}
}
13行目は、Removeメソッドで値を指定して削除しています。
要素を削除する-範囲を指定(RemoveRangeメソッド)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a = new List<string>();
a.Add("赤");
a.Add("黄");
a.Add("青");
a.Add("緑");
a.RemoveRange(1,2);
foreach (var b in a)
{
Console.WriteLine(b);// 赤 緑
}
}
}
14行目は、RemoveRangeメソッドでリストの範囲を指定して要素を削除しています。
1つめの引数はインデックスで、2つめの引数は要素の数です。
インデックスは0から始まります。
要素をすべて削除する (Clearメソッド)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a= new List<string>();
a.Add("赤");
a.Add("黄");
a.Add("青");
a.Clear();
Console.WriteLine(a.Count);// 0
}
}
13行目は、Clearメソッドですべての要素を削除しています。
要素を逆順にする(Reverseメソッド)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a= new List<string>() { "赤", "黄", "青" };
a.Reverse();
foreach (var b in a)
{
Console.WriteLine(b);// 青 黄 赤
}
}
}
10行目は、Reverseメソッドで要素を逆順にしています。
メソッドの引数と戻り値がリストの場合
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var color = new List<string>() { "赤", "黄", "青" };
var b = new List<string>();
b = printColor(color);
}
private static List<string> printColor(List<string> a)
{
return a;
}
}
11行目は、呼び出し元のメソッドです。引数にリストを指定しています。戻り値もリストです。
14行目は、定義されたメソッドです。「List<string> a」のaが変数で、その前がデータ型のリストです。
呼び出し元のメソッドの引数の変数名(11行目のcolor)と定義されたメソッドの引数の変数名(14行目のa)は異なっていても使用できます。
リストの中にリストがあるサンプル
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var list1 = new List<List<string>> ();
var list2 = new List<string>();
list2.Add("赤");
list2.Add("黄");
list2.Add("青");
var list3 = new List<string>();
list3.Add("red");
list3.Add("yellow");
list3.Add("blue");
list1.Add(list2);
list1.Add(list3);
Console.WriteLine(list1[0][0]); // 赤
Console.WriteLine(list1[0][1]); // 黄
Console.WriteLine(list1[0][2]); // 青
Console.WriteLine(list1[1][0]); // red
Console.WriteLine(list1[1][1]); // yellow
Console.WriteLine(list1[1][2]); // blue
}
}
8行目は、リストの中にリストを定義しています。
10~18行目は、通常のリストを作成しています。
20,21行目は、リストにリストを追加しています。
23~28行目は、リストの値を取得しています。
リストから配列にコピーする(ToArrayメソッド)
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var a= new List<string>() { "赤", "黄", "青" };
string[] b= a.ToArray();
//b.Add("オレンジ"); リストでないのでエラーになる
}
}
8行目は、Listです。
10行目は、ToArrayメソッドでリストを新しい配列にコピーしています。
ListとArrayListの違い
using System;
using System.Collections.Generic;
using System.Collections;
class Test1
{
static void Main()
{
var a= new ArrayList();
a.Add("赤");
a.Add(1);
var b= new List<string>();
b.Add("赤");
//b.Add(1); エラー
}
}
8行目は、ArrayListです。
9,10行目のように異なる型の値を代入できます。
12行目は、Listです。ジェネリクスでstringを指定しています。
→同じ型(string)の値のみ代入できます。
14行目はstring型ではないのでエラーになります。
関連の記事