您的位置:首页 > 编程语言 > C#

.NET/C#中对自定义对象集合进行自定义排序的方法

2010-06-08 15:35 639 查看
一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car类型,要把它排序,系统是不知道怎么办的。

那么,如何告知系统排序的规则呢?有以下几种方法:

1:对类实现IComparable接口,示例如下:

代码6

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

namespace SortTeset5
{
class Product
{
public string Name { get; private set; }
public decimal Price { get; private set; }

public Product(string name, decimal price)
{
Name = name;
Price = price;
}

public Product() { }

public static List<Product> GetSampleProduct()
{
return new List<Product>
{
new Product{Name="Watch",Price=12345.56m},
new Product{Name="Knife",Price=224.50m},
new Product{Name="Rope",Price=12.50m},
new Product{Name="ETorch",Price=58.5m}
};
}

public override string ToString()
{
return string.Format("{0} : {1}", Name, Price);
}
}

class Program
{
static void Main(string[] args)
{
List<Product> ProductSample = Product.GetSampleProduct();
foreach (Product tmp in ProductSample)
{
Console.WriteLine(tmp);
}

Console.WriteLine();

foreach (Product tmp in ProductSample.OrderBy(p=>p.Name))
{
Console.WriteLine(tmp);
}
}
}
}


“这里似乎调用了一个OrderBy方法,但查阅一下MSDN,就会发现这个方法在List<Product>中根本不存在。之所以能调用它,是由于存在一个扩展方法。这里实际不再是"原地"对列表进行排序,而只是按特定的顺序获取列表的内容。有的时候,你需要更改实际的列表;但有的时候,没有任何副作用的排序显得更"善解人意"。重点在于,现在的写法更简洁,可读性更好(当然是在你理解了语法之后)。我们的想法是"列表按名称排序",现在的代码正是这样做的。并不是"列表通过将一个产品的名称与另一个产品的名称进行比较来排序",就像C# 2代码所做的那样。也不是使用知道如何将一个产品与另一个产品进行比较的另一个类型的实例来按名称排序。这种简化的表达方式是C# 3的核心优势之一。既然单独的数据查询和操作是如此的简单,那么在执行更大规模的数据处理时,仍然可以保持代码的简洁性和可读性,这进而鼓励开发者以一种"以数据为中心"的方式来观察世界。”

最后这两步的语法,绝对是一个会用其它语言比如C/C++,VB的人所无法明白的,C#进化速度真是快。。。。。。。

关于排序,暂时还不知道有没有其它的方法,日后再补记。

参考书籍:《C#与.NET3.5高级程序设计》,《深入解析C#》(C# in depth) 。

另外,这篇文章还提到了另外两种更深入的做法:1,自定义排序,可以提供一个接口,接受一个排序指标,然后对指定List进行排序,2,用LINQ的orderby子句实现排序。



以自定义方式可以实现的更多的控制,例如我们重构BookComparison:

// Release : code01, 2009/04/12

// Author  : Anytao, http://www.anytao.com/ 
// List    : BookComparison.cs

public class BookComparison : IComparer<Book>{

private ComparisonType type;

public BookComparison(ComparisonType type)

{        this.type = type;    }

public int Compare(Book x, Book y)

{

switch (this.type)

{

case ComparisonType.Price:

return x.Price.CompareTo(y.Price);

break;

case ComparisonType.PublishDate:

return x.PublishDate.CompareTo(y.PublishDate);

break;

default:

break;

}

return 0;

}

}

添加一个ComparisonType结构,在BookComparson初始化时决定Comparison的方式:

//04 Sort by custom comparison: BookComparison

bs.Books.Sort(new BookComparison(ComparisonType.PublishDate).Compare);

结论

自定义Comparison为实现更好的Sort控制,提供了很好的扩展机制。在我们的实际应用中,对于例如BookStore这样的具体应用而言,我更推荐以LINQ的OrderBy来实现,例如:

//05 Sort by Linq

var list = from c in bs.Books

orderby c.PublishDate ascending

select c;

foreach (var item in list)

{

Console.WriteLine(string.Format("{0}:{1}, {2}", item.Name, item.Price, item.PublishDate.ToString()));

}

orderby子句可以选择任意的排序条件,同时ascending或者descending控制升序和降序。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐