C#スタディノートの並べ替えと検索

IComparableインターフェースとIComparerインターフェース

データ項目をソートできるようにするには、リスト内の2つのデータ項目の相対位置を決定する必要があります。つまり、2つのオブジェクト間の「サイズ」関係を決定する必要があります。一般的に、サイズの関係を定義する方法は2つあります。
最初の方法はオブジェクト自体です。オブジェクトがそれ自体で比較操作を実行するためには、オブジェクトはIComparableインターフェースを実装する必要があります。つまり、少なくとも1つのCompareTo()メンバーが必要です。
System.IComparable次のように、インターフェイスにメソッドがあります。

	int CompareTo(object obj);

現在のオブジェクトと比較するオブジェクトの「サイズ」に基づいて、正、0、または負の数を返します。
すべての単純な値型(例えばintdoubledecimal等)、文字列と列挙クラス実装このインタフェースは、長い値が順序付けされるように、ユーザ定義型の任意の種類は、このインタフェースを実現することができます。
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、一般的なクラスを提供ReverseBinarySearchおよびSort方法を。ただし、このパッケージを介してこれらの一般的な操作を実行することは、これらの操作をIListに直接適用するよりも効率的ではありません。

2.SortedList

SortedListクラスのオブジェクトは、要素を追加するときに自動的に並べ替えられます。オブジェクト(オブジェクトを含む)は
SortedListインスタンスを作成することでコピーおよびソートできますIDictionarySortedList

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());
	}
}

おすすめ

転載: blog.csdn.net/qq_45349225/article/details/114297339
おすすめ