本コンテンツはプロモーションが含まれます。

リスト

スポンサーリンク
スポンサーリンク

リストとは

 リストとは配列と同様に配下の要素が順序付けられたコレクションです。リストのメリットは配列が固定長の長さしか持てないけれども、リストは可変長の長さを持てます。

 リストの種類は以下の4つがあります。

  • List
  • LinkedList
  • Stack
  • Queue

List

 Listは、配列を利用したデータ構造です。大きく異なることは、配列は固定長であるのに対し、Listは可変長であることです。

Listで使用できるメソッドは以下の通りです。

分類 メンバ 概要
取得 List<T> GetRange(int index,int count) index番目からcount個数のリストを返す
int Capacity 格納可能な要素の数を取得・設定
int Count 現在使用しているリストの個数

追加/削除

void Add(T item) itemをリストに挿入する
void Insert(int index,T item) リストのindex番目にitemを挿入する
bool Remove(T item) 最初に見つけたitemを削除する
bool RemoveRange(int index,int count) index番目からcount個数削除する
void Clear() リストの中身を空にする
検索 bool Contains(T item) itemがリストにあるかどうか
int IndexOf(T item) 要素itemが格納されているインデックス
変換 void CopyTo([int index,]T[] array[,int arrayIndex[,int arrayCount]]) array配列をリストの指定した位置(index)に配列のarrayIndexからarrayCount個分挿入する
void Reverse([int index,int count]) 要素の順序を反転させる
void Sort([Comparison<T> comparison]) リストの順序を定められたルールでソートする(comparisonに指定がなければTで定義されているデフォルトの比較関数を用いる。)

 取得、追加、削除メソッドのの使用例は次の通りです。

List<int> list1 = new List<int>();//int型のリストを作成
for (int i = 1; i <= 10; i++)
{
    list1.Add(i);//1から10までをlist1に格納。
}

List<int> list2 = list1.GetRange(2, 3);//list2にはlist1の2番目から3つ取り出す

foreach (int index in list2)
{
    Console.WriteLine(index);//取得したlist2を順番に画面表示する
}

Console.WriteLine(list1.Count);//list1に追加されている要素の個数(10)を表示する

list2.Insert(1, 10);//list2は3、4,5が格納されているが、1番目に10を挿入する
                    //list2 ⇒3,10,4,5
foreach (int index in list2)
{
    Console.WriteLine(index);
}

list2.Remove(4);//list2から4を削除する
list2.Remove(6);//list2に格納されていない6も引数に与えられる(戻り値がbool型なのでfalseが帰ってくるだけ)
foreach (int index in list2)
{
    Console.WriteLine(index);
}

list2.Clear();
Console.WriteLIne(list2.Count);
foreach(int index in list2){
  Console.WriteLine(index);
}

検索形のメソッドの使用例を示します

List<int> list1 = new List<int>();//int型のリストを作成
for (int i = 1; i <= 10; i++)
{
    list1.Add(i);//1から10までをlist1に格納。
}

Console.WriteLine(list1.Contains(4));//4は存在するためtrueが帰ってくる
Console.WriteLine(list1.Contains(0));//0は存在しないためfalseが帰ってくる。

変換形(どちらと言えばソート)のメソッドを示します。
ここはInterfaceの概念を理解してからの方がわかりやすいので、一度そちらの本を参照してからもう一度このページを読んでくださると理解が深まります。

using System.Collections.Generic;
using System;
using System.Collections;
using System.Text;

public class Program
{

    public static void Main()
    {
        List<string> strList = new List<string>();
        strList.Add("foo");
        strList.Add("apple");
        strList.Add("animal");
        strList.Add("bag");
        strList.Add("note-PC");
        strList.Add("desktop-PC");

        List<string> strList2 = new List<string>();
        strList2 = strList.GetRange(0, strList.Count);

        Console.WriteLine("辞書列でソートする前");
        Console.WriteLine(WirteList(strList));
        strList.Sort();//ソートに何も設定しない(辞書式を用いる)場合

        Console.WriteLine("辞書列でソートした後");
        Console.WriteLine(WirteList(strList));

        Console.WriteLine("文字列の長さでソートする前");
        Console.WriteLine(WirteList(strList2));
        strList2.Sort(new StringComp2());//ソートに条件を設定する(文字列の長さ)場合

        Console.WriteLine("文字列の長さででソートした後");
        Console.WriteLine(WirteList(strList2));
    }


    //自作メソッド
    //リストを引数にとり、スペース区切りの1行の文字列を表示する
    static string WirteList(List<string> strList)
    {
        StringBuilder sb = new StringBuilder();
        foreach(string hoge in strList)
        {
            sb.Append(hoge).Append(" ");
        }
        return sb.ToString().Trim();
    }


//ICompareeインタフェースを継承して文字列の比較を文字の長さで行うように変更するのに使用する
public class StringComp2 : IComparer<string>
{
    //IcompareインタフェースにはCompareメソッドを比較する必要がある。
    public int Compare(string x, string y)
    {
        if (x.Length > y.Length)
        {
            return 1;//xの文字列の長さがyの文字列の長さより長ければ正の値を返す
        }else if(x.Length < y.Length)
        {
            return -1;//xの文字列の長さがyの文字列の長さより短ければ負の値を返す
        }
        else
        {//n文字列の長さが等しければ、辞書順で比較する
            return x.CompareTo(y);
        }
    }
}

実行結果は次の通りです。辞書順と文字列長できちんとソートされているのが分かります。

まとめ

 コレクションの1つであるListを学びました。

Listは可変長故に配列よりも便利に使用できます。
殆どが配列でも出来ますが、可変長が故にAddメソッドで最後尾に項目を追加したり、指定した場所に値を挿入したり出来ます。その度にCountメンバで返却される値は変わります。

 ソートですが、ジェネリックを使用しているため、同一の型のものであればどのような順序でも整列が可能です。上記サンプルでは辞書別と文字列長を使用しました。
 辞書列式がstring型に備わっているソートの順序、文字列長でソートした後辞書列に揃えるようにしたのがIComparerインタフェースを継承したStringComp2を用います。詳しくはオブジェクト指向の事を話す時に説明します。

 次はLinkedList,Stack,Quereについて話します。

コメント