C#コレクションのリスト

20084 ワード

.NET Frameworkは動的リストリストに汎用クラスリストを提供する.このクラスはIList,ICollection,IEnumerable,IList,ICollection,IEnumerableインタフェースを実現する.1.リストを作成してレーサークラスを作成します.次の例で使用します.
   public class Racer : IComparable, IFormattable
      {
        public int Id { get; private set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Country { get; set; }
        public int Wins { get; set; }

        public Racer(int id, string firstName, string lastName, string country)
          : this(id, firstName, lastName, country, wins: 0)
        {
        }
        public Racer(int id, string firstName, string lastName, string country, int wins)
        {
          this.Id = id;
          this.FirstName = firstName;
          this.LastName = lastName;
          this.Country = country;
          this.Wins = wins;
        }

        public override string ToString()
        {
          return String.Format("{0} {1}", FirstName, LastName);
        }

        public string ToString(string format, IFormatProvider formatProvider)
        {
          if (format == null) format = "N";
          switch (format.ToUpper())
          {
            case null:
            case "N": // name
              return ToString();
            case "F": // first name
              return FirstName;
            case "L": // last name
              return LastName;
            case "W": // Wins
              return String.Format("{0}, Wins: {1}", ToString(), Wins);
            case "C": // Country
              return String.Format("{0}, Country: {1}", ToString(), Country);
            case "A": // All
              return String.Format("{0}, {1} Wins: {2}", ToString(), Country, Wins);
            default:
              throw new FormatException(String.Format(formatProvider,
                    "Format {0} is not supported", format));
          }
        }

        public string ToString(string format)
        {
          return ToString(format, null);
        }

        public int CompareTo(Racer other)
        {
          if (other == null) return -1;
          int compare = string.Compare(this.LastName, other.LastName);
          if (compare == 0)
            return string.Compare(this.FirstName, other.FirstName);
          return compare;
        }
      }

 
デフォルトのコンストラクション関数を呼び出すと、リストオブジェクトを作成できます.リストでは、リストとして宣言された値にタイプを指定する必要があります:var intList=new List();  var racers =new List(); デフォルトのコンストラクション関数を使用して空のリストを作成します.要素がリストに追加されると、リストの容量は4つの要素を受け入れるように拡大されます.5番目の要素に追加すると、リストのサイズが8つの要素を含むように再設定されます.8つの要素が足りない場合、リストのサイズは16の要素を含むように再設定されます.毎回リスト容量を元の2倍に再設定します.リストの容量が変更されると、セット全体が新しいメモリブロックに再割り当てされます.List汎用クラスの実装コードでは,T型の配列を用いた.メモリを再割り当てして、新しい配列を作成します.Array.Copy()メソッドは、古い配列の要素を新しい配列にコピーします.時間を節約するために、リスト内の要素の個数を事前に知っていれば、構造関数でその容量を定義することができる:List intList=new List(10);Capacityプロパティを使用すると、集合の容量:intListを取得および設定できます.Capacity = 20; 集合の要素数はCount属性で読み出されます.リストに要素が追加されていて、追加したくない要素がある場合は、TrimExcess()メソッドを呼び出して不要な容量を除去できます.しかし,再配置に時間がかかるため,要素の個数が容量の90%を超えると,この方法は何もしない.  intList.TrimExcess(); 集合初期値を使用して集合に値を割り当てることもできます:var intList=new List(){1,2};集合初期値はコンパイルされたプログラムセットのILコードに反映されず、コンパイラは集合初期値を初期値リストの各呼び出しAdd()メソッドに変更します.2.要素を追加Add()メソッドを使用して、リストに要素を追加することができる:intList.Add(1);   intList.Add(2); AddRange()メソッドを使用すると、集合に複数の要素を一度に追加できます.AddRange()メソッドのパラメータはIEnumerableタイプのオブジェクトであるため、配列:intListを渡すことができる.AddRange(     new Int[]{1,2}   ); リストをインスタンス化するときに集合の要素の数を知っていれば、AddRange()メソッド:var intList=new List(new Int[]{1,2});3.挿入要素Insert()メソッドを使用して、指定位置に要素を挿入することができる:intList.Insert(3,4); メソッドInsertRange()は、大量の要素を挿入できます.  racers.InsertRange(3, new Racer[] {     new Racer(12, "Jochen", "Rindt", "Austria", 6),     new Racer(22, "Ayrton", "Senna", "Brazil", 41) });
4.アクセス要素IListとIListインタフェースを実現したすべてのクラスには、インデックスを使用して要素にアクセスできるインデックスが提供されている:int i=intList[0];Stringクラスはインデックスから文字にアクセスすることもできます:string s=“sdas”;  char c = s[0]; ListコレクションクラスはIEnumerableインタフェースを実現しているのでforeach(http://www.cnblogs.com/afei-24/p/6738155.html)文は集合中の要素を遍歴する:foreach(int i in intList){/...}foreach文のほか、ListクラスはActionパラメータで宣言するForEach()メソッドを提供し、このメソッドはActionパラメータで宣言する:public void ForEach(Action action);  .NEt実装ForEach()メソッドのコードは、public class List:ILIst{private T[]items;//...public void ForEach(Action){if(action=null)throw new ArgumentNullException("action");foreach(T item in items){action(item);}}例:racers.ForEach(     r =>     {       Console.WriteLine(r.ToString())     }   ); ここではlambda式(http://www.cnblogs.com/afei-24/p/6795233.html).
5.エレメントを削除する場合、インデックスを使用するか、削除するエレメントを渡すことができます:var graham=new Racer(7,“Graham”,“Hill”,“UK”,14);  var emerson = new Racer(13, "Emerson", "Fittipaldi", "Brazil", 14);   var mario = new Racer(16, "Mario", "Andretti", "USA", 12);   var racers = new List(20) { graham, emerson, mario };   racers.RemoveAt(3);   racers.Remove(graham); 削除する要素をコレクション内で検索する必要があるため、インデックスによる削除が速いです.Removeメソッドは、まずコレクションで検索し、IndexOfメソッドで要素のインデックスを取得し、そのインデックスを使用して要素を削除します.IndexOfメソッドでは、要素タイプがIEquatableインタフェースを実装しているかどうかを確認します.もしそうであれば、このインタフェースのEquals()メソッドを呼び出し、セット内の要素がEquals()メソッドに渡される要素に等しいかどうかを決定します.このインタフェースが実装されていない場合は、ObjectクラスのEquals()メソッドを使用してこれらの要素を比較します.ObjectクラスのEquals()メソッドでは、デフォルトで値タイプをビット単位で比較するコードが実装され、参照タイプに対してのみ参照が比較されます.RemoveRange()メソッドでは、コレクションから多くの要素を削除できます.最初のパラメータは削除を開始する要素インデックスを指定し、2番目のパラメータは削除する要素の数を指定します:int index=3;  int count = 5;   racers.RemoveRange(index,count); コレクション内のすべての要素を削除するには、ICollectionインタフェースで定義されたClear()メソッド:racers.Clear(); RemoveAll()メソッドは、指定したプロパティがあるので要素を削除します.この方法はPredicateタイプのパラメータ定義を使用する.以下、Predicateタイプについて説明します.6.検索するエレメントのインデックスを取得するか、エレメント自体を検索します.使用可能な方法としては、IndexOf()、LastIndexOf()、FindIndex()、FindLastIndex()、Find()、FindLast()がある.要素のみが存在するかどうかをチェックする場合は、Exists()メソッドを使用します.IndexOf()メソッドでは、オブジェクトをパラメータとして使用する必要があります.このメソッドは、集合内に要素が見つかった場合、その要素のインデックスを返します.見つからない場合は-1に戻ります.IndexOf法はIEquatableインタフェースを用いて要素を比較した.IndexOf()メソッドを使用すると、コレクション全体を検索する必要がなく、どの要素から検索するか、いくつかの要素を検索するかを指定することもできます.IndexOf()メソッドを使用して指定された要素を検索するほか、FindIndex()、FindLastIndex()、Find()、FindLast()メソッドで定義できるプロパティのある要素を検索することもできます.これらのメソッドには、public int FindIndex(Predicate match)などのPredicateタイプのパラメータが必要です.Predicateタイプは、public delegate bool Predicate(T obj);その用法はForeach()メソッドのAction依頼と類似している.Predicate依頼がtrueを返すと、一致する要素が表示されます.falseを返すと、見つからないことを示し、検索を続けます.FindIndex()、FindLastIndex()メソッドは、見つかった一致する要素のインデックスを返します.Find()、FindLast()は、この一致する要素を返します.1つではなくPredicateに一致するすべてのアイテムを取得する場合は、FindAll()メソッドを使用します.FindAll()メソッドの使い方は同じです.FindAll()メソッドは、最初のアイテムを見つけると停止せず、反復セットの各アイテムを継続する:List l=racers.FindAll(r => r.Wins > 20); 7.ソートリストクラスは、Sort()メソッドを使用してセット内の要素をソートすることができる.Sort()メソッドは、高速ソートアルゴリズムを使用してソートされます.Sort()メソッドには複数のリロードメソッドがあります.汎用依頼Comparisonと汎用インタフェースIComparerと、1つの範囲値と汎用インタフェースIComparer:public voidリストを渡すことができる.Sort();   public void List.Sort(Comparison);   public void List.Sort(IComparer);   public void List.Sort(Int32,Int32,IComparer); パラメータなしのSort()メソッドを使用できるのは、集合内の要素がIComparableインタフェースを実装している場合のみです.public voidリストを使用する.Sort(IComparer); IComparerインタフェースを実装するクラスを定義する必要があります.Sort(IComparer)メソッドを呼び出すと、IComparerインタフェースを実装するクラスのCompareメソッドが呼び出されます.
      public class RacerComparer : IComparer
          {
             public enum CompareType
              {
                FirstName,
                LastName,
                Country,
                Wins
              }
            private CompareType compareType;
            public RacerComparer(CompareType compareType)
            {
              this.compareType = compareType;
            }

            public int Compare(Racer x, Racer y)
            {
              if (x == null && y == null) return 0;
              if (x == null) return -1;
              if (y == null) return 1;

              int result;
              switch (compareType)
              {
                case CompareType.FirstName:
                  return string.Compare(x.FirstName, y.FirstName);
                case CompareType.LastName:
                  return string.Compare(x.LastName, y.LastName);
                case CompareType.Country:
                  result = string.Compare(x.Country, y.Country);
                  if (result == 0)
                    return string.Compare(x.LastName, y.LastName);
                  else
                    return result;
                case CompareType.Wins:
                  return x.Wins.CompareTo(y.Wins);
                default:
                  throw new ArgumentException("Invalid Compare Type");
              }
            }
          }

クライアントコード:racers.Sort(new RacerComparer(RacerComparer.CompareType.Country)); public voidリストを使用する.Sort(Comparison); Comparisonの依頼が必要です.Comparison依頼:public delagate int Comparsion(int x,int y);クライアントコード:racers.Sort((r1,r2) => r2.Wins.CompareTo(r1.Wins)); Reverse()メソッドを使用すると,集合全体の順序を逆転させることができる.8.タイプ変換はListクラスのConvertAll()メソッドを使用しているので、タイプの集合を別のタイプに変換することができます.ConvertAll()メソッドはConverte委任、Converte委任を使用します:public sealed delegate TOutput Converter(TInput from);
//    Person 
        public class Person
        {
            private string name;
            
            public Person(string name)
            {
                this.name = name;
            }
            
            public override string ToString()
            {
                return name;
            }
        }

クライアントコード:List persons=racers.ConvertAll(     r => new Person(r.FiastName+""+ r.LastName)   ); 9.読み取り専用コレクションがコレクションを作成すると、それらは読み書き可能になります.ただし、集合を塗りつぶすと、AsReadOnly()メソッドを使用して読み取り専用集合を作成できます.  List racers2 =racers.AsReadOnly();