C# 泛型集合的自定義類型排序的實現(xiàn)
一、泛型集合List<T>排序
經(jīng)sort方法之后,采用了升序的方式進行排列的。
List<int> list = new List<int>() { 2, 4, 1, 3, 5, -2, 0, 10 };
Console.Write("排序前...");
foreach (var item in list)
{
Console.Write(item + "\t");
}
list.Sort();
Console.WriteLine();
Console.WriteLine("排序后...");
foreach (var item in list)
{
Console.Write(item + "\t");
}

二、對自定義類型進行排序
定義一個普通類:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
接下來,將定義的Person實例化,排序;
List<Person> list = new List<Person>() {
new Person(){Name="張叁",Id=1},
new Person() {Name="李四",Id=4 },
new Person() {Name="王五",Id=2 },
};
list.Sort();
foreach (var item in list)
{
Console.Write(item.Id);
}
結(jié)果如下:


在int類型中實現(xiàn)了IComparable,所以可以通過Sort()直接排序;

int類型是實現(xiàn)了IComparable這個接口的。那么如果讓自定義類型Person也可以排序,那么試試實現(xiàn)該接口;
那么將上面的代碼修改一下看看
public class Person:IComparable
{
public int Id { get; set; }
public string Name { get; set; }
public int CompareTo(object obj)
{
Person p = obj as Person;
return this.Id.CompareTo(p.Id);
}
}
結(jié)果如下:

三、對集合按照多種不同規(guī)則進行排序
實際使用中,經(jīng)常需要對集合按照多種不同規(guī)則進行排序,這就需要定義其他比較規(guī)則,可以在Compare方法中定義,該方法屬于IComparer<T>泛型接口,請看下面的代碼:
public class PersonNameDesc : IComparer<Person>
{
//存放排序器實例
public static PersonNameDesc NameDesc = new PersonNameDesc();
public int Compare(Person x, Person y)
{
return System.Collections.Comparer.Default.Compare(x.Name, y.Name);
}
}
Compare方法的參數(shù)為要進行比較的兩個同類型對象,返回值為int類型,返回值處理規(guī)則與CompareTo方法相同。其中的Comparer.Default返回一個內(nèi)置的Comparer對象,用于比較兩個同類型對象。
下面用新定義的這個比較器對集合進行排序:
//================對集合按照多種不同規(guī)則進行排序=========================
List< Person > list = new List<Person>() {
new Person(){Name="張叁",Id=1},
new Person() {Name="李四",Id=4 },
new Person() {Name="王五",Id=2 },
new Person() {Name="李四",Id=6 },
new Person() {Name="王五",Id=3 },
};
list.Sort(PersonNameDesc.NameDesc);
foreach (var item in list)
{
Console.Write(item.Name + "\t");
}
Console.Read();
結(jié)果如下:

四、使用linq進行排序
sort方法的一個重載是Comparison<T>類型的參數(shù);

那就看一下 Comparison<T>是怎么一回事吧:

List<Person> list = new List<Person>()
{
new Person(){Name="張叁",Id=1},
new Person() {Name="李四",Id=4 },
new Person() {Name="王五",Id=2 },
new Person() {Name="李四",Id=6 },
new Person() {Name="王五",Id=3 },
};
//匿名委托
list.Sort((a, b) => a.Id - b.Id);
foreach (Person p in list)
{
Console.WriteLine(p.Name + "\t" + p.Id);
}
Console.Read();
結(jié)果如下:

List<Person> list = new List<Person>()
{
new Person(){Name="張叁",Id=1},
new Person() {Name="李四",Id=4 },
new Person() {Name="王五",Id=2 },
new Person() {Name="李四",Id=6 },
new Person() {Name="王五",Id=3 },
};
var l = from p in list
orderby p.Id descending
select p;
foreach (Person p in l)
{
Console.WriteLine(p.Name + "\t" + p.Id);
}
Console.Read();
結(jié)果如下:

今天的分享就到這里了,好久沒寫過博客了,加班多,太忙了,抽空復(fù)習一下基礎(chǔ)知識;
到此這篇關(guān)于C# 泛型集合的自定義類型排序的實現(xiàn)的文章就介紹到這了,更多相關(guān)C# 泛型集合的自定義類型排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
NumberToUpper數(shù)字轉(zhuǎn)中文詳解
本文介紹NumberToUpper數(shù)字轉(zhuǎn)中文的方法,大家參考使用吧2013-12-12
C# 將透明圖片的非透明區(qū)域轉(zhuǎn)換成Region的實例代碼
以下代碼實現(xiàn)將一張帶透明度的png圖片的非透明部分轉(zhuǎn)換成Region輸出的方法,有需要的朋友可以參考一下2013-10-10
淺析C# 使用Process調(diào)用外部程序中所遇到的參數(shù)問題
這篇文章主要介紹了C# 使用Process調(diào)用外部程序中所遇到的參數(shù)問題,需要的朋友可以參考下2017-03-03
C# Hashtable/Dictionary寫入和讀取對比詳解
本文中將從基礎(chǔ)角度講解HashTable、Dictionary的構(gòu)造和通過程序進行插入讀取對比2013-11-11

