IComparableインターフェースとIComparerインターフェース
データ項目をソートできるようにするには、リスト内の2つのデータ項目の相対位置を決定する必要があります。つまり、2つのオブジェクト間の「サイズ」関係を決定する必要があります。一般的に、サイズの関係を定義する方法は2つあります。
最初の方法はオブジェクト自体です。オブジェクトがそれ自体で比較操作を実行するためには、オブジェクトはIComparable
インターフェースを実装する必要があります。つまり、少なくとも1つのCompareTo()
メンバーが必要です。
System.IComparable
次のように、インターフェイスにメソッドがあります。
int CompareTo(object obj);
現在のオブジェクトと比較するオブジェクトの「サイズ」に基づいて、正、0、または負の数を返します。
すべての単純な値型(例えばint
、double
、decimal
等)、文字列と列挙クラス実装このインタフェースは、長い値が順序付けされるように、ユーザ定義型の任意の種類は、このインタフェースを実現することができます。
2番目の方法は、外部コンパレータを提供することです。オブジェクトのサイズを比較できるようにするために、ICompare
インターフェースを実装するコンパレーターを提供することができます。
System.Collections.IComparer
次のように、インターフェイスにメソッドがあります。
int Compare(object obj1, object obj2);
最初のオブジェクトと2番目のオブジェクトの「サイズ」に基づいて、正、0、または負の数を返します。例えば:
int Compare(object obj1, object obj2){
return (abj1 as Book).price - (obj2 as Book).price;
}
上記のコードは、本が価格のサイズに従って昇順でソートされていることを示しています。0未満の値は、最初のオブジェクトが2番目のオブジェクトよりも「小さい」ことを意味し、0は、2つのオブジェクトが「サイズが等しい」ことを意味し、正の数は、最初のオブジェクトが2番目のオブジェクトよりも「大きい」ことを意味します。 。
Arrayクラスを使用して並べ替えと検索
System.Array
クラスは、配列の並べ替えと検索に使用されるクラスです。Array
このクラスは、並べ替えと検索に使用できるSort()
合計をBinarySearch()
提供しReverse()
、順序を逆にするメソッドも提供します。
1.Array.Sort()及逆
Array.Sort()
この方法は、一次元配列のソートを実現することができます。次の形式が一般的に使用されます。
public static void Sort(Array); // 对数组元素排序, 每个元素要求实现IComparable
public static void Sort(Array keys, Array values); // 根据keys数组对values排序
public static void Sort(Array, IComparer); // 对数组排序, 使用外部比较器
public static void Sort(Array keys, Array values, IComparer); // 根据keys数组对values排序, 排序时, 使用外部比较器
Array.Reverse()
メソッドは、配列全体の順序を逆にするために使用できます。
public static void Reverse(Array); // 对数组排序, 每个元素要求实现IComparable
2. Array.Sort()の汎用メソッド
Array.Sort()
一般的なメソッドmethodもありSort<T>(T[])
ます。IComparer<T>
パラメータを取ることもできます。さらに、Comparsiomコミッションを取ることもできます。コミッションのプロトタイプは次のとおりです。
public delegate int Comparsion<in T>(T x, T y);
デリゲートパラメーターを記述する簡単な方法は、Lambda式を使用することです。次に例を示します。
Array.Sort<Person>(people, (p1, p2) => p1.Age - p2.Age);
人々の配列が年齢で最小から最大にソートされていることを示します。
3.Array.BinarySearch()
Array.BinarySearch()
このメソッドは、ソートされた一連の配列で要素検索を実現でき、次の形式が一般的に使用されます。
public static int BinarySearch(Array, object); // 在数组中进行查找对象object
public static int BinarySearch(Array, object, IComparer); // 使用外部比较器
使用にBinarySearch()
注意してください:BinarySearch()を実行する前に配列をソートする必要があります。
例:
using System;
public class Test
{
public static void Main(string[] args){
string[] ary = {
"Apple", "Pearl", "Banana", "Carrot" };
Show(ary);
Array.Sort(ary);
Show(ary);
int it = Array.BinarySearch(ary, "Pearl");
Console.WriteLine(it);
Array.Reverse(ary);
Show(ary);
}
public static void Show(object[] ary){
foreach (object obj in ary)
Console.Write(obj + " ");
Console.WriteLine();
}
}
演算結果:
コレクションの並べ替えと検索
コレクションクラスには、並べ替えと検索のためのメカニズムもいくつかあります。次に例を示します。
- ①多くのクラス
Contains()
で検索する方法があります。 - ②クラス内の多くの
ToArray()
メソッドを配列に変換し、ソートして検索することができます。 - ③他のコレクションから新しいArrayListおよびSortedListオブジェクトを作成し、並べ替えて検索することができます。
1.ArrayList的Sort()及二分探索()
ArrayList
のメソッドは並べ替えと検索に関連しており、一般的な方法は次のとおりです。
public virtual void Sort();
public virtual void Sort(IComparer);
public virtual int BinarySearch(object);
public virtual int BinarySearch(object, IComparer);
コレクションクラスのArrayList
場合、インスタンスを作成できます。
public ArrayList(ICollection);
この構築方法では、コレクションクラスのオブジェクトがコピーされ、ArrayList
クラスが生成されます。
ArrayList
またAdapter()
、他のIList
オブジェクトを含めるためのメソッドも提供しますArrayList
。
public static ArrayList Adapter(IList);
Adapter
コピーされIList
ていないコンテンツは、パッケージをIList
作成するためだけのものですArrayList
。したがって、コンテンツにIList
変更を加えると、コンテンツにも影響しArrayList
ます。この方法は、するために使用することができArrayList
、一般的なクラスを提供Reverse
、BinarySearch
およびSort
方法を。ただし、このパッケージを介してこれらの一般的な操作を実行することは、これらの操作をIListに直接適用するよりも効率的ではありません。
2.SortedList
SortedList
クラスのオブジェクトは、要素を追加するときに自動的に並べ替えられます。オブジェクト(オブジェクトを含む)は
、SortedList
インスタンスを作成することでコピーおよびソートできます。IDictionary
SortedList
public class Test
{
static void Main(string[] args) {
Person[] Persons = {
new Person("Liu", true, 21),
new Person("Zhang", true, 18),
new Person("Tang", false, 23),
new Person("Lu", false, 21)
};
Random rnd = new Random();
SortedList list1 = new SortedList();
foreach (Person r in Persons)
list1.Add(r.ToString(), "Room:" + rnd.Next(1000));
Person.PrintKeysAndValues(list1);
SortedList list2 = new SortedList(list1, new MyComparer());
Console.WriteLine("111111111111111");
Person.PrintKeysAndValues(list2);
}
}
public struct Person : IComparable
{
public string Name;
public bool Sex;
public int Age;
public Person(string name, bool sex, int age) {
this.Name = name;
this.Sex = sex;
this.Age = age;
}
public int CompareTo(object obj) {
if (!(obj is Person))
throw new System.ArgumentException();
Person rec = (Person)obj;
if (this.Age > rec.Age) return 1;
else if (this.Age == rec.Age) return 0;
return -1;
}
public override string ToString() {
return "Name: " + Name + "; Sex: " + Sex + "; Age: " + Age;
}
public static void PrintKeysAndValues(SortedList myList) {
IDictionaryEnumerator myEnumerator = myList.GetEnumerator();
while (myEnumerator.MoveNext())
Console.WriteLine("{0}:\t\t{1}", myEnumerator.Key, myEnumerator.Value);
Console.WriteLine();
}
}
public class MyComparer : IComparer
{
public int Compare(object obj1, object obj2) {
if (!(obj1 is Person) || !(obj2 is Person))
throw new System.ArgumentException();
Person rec1 = (Person)obj1;
Person rec2 = (Person)obj2;
return rec1.Name.ToLower().CompareTo(rec2.Name.ToLower());
}
}