.NET/C#中对自定义对象集合进行自定义排序的方法
2010-06-08 15:35
639 查看
一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car类型,要把它排序,系统是不知道怎么办的。
那么,如何告知系统排序的规则呢?有以下几种方法:
1:对类实现IComparable接口,示例如下:
代码6
“这里似乎调用了一个OrderBy方法,但查阅一下MSDN,就会发现这个方法在List<Product>中根本不存在。之所以能调用它,是由于存在一个扩展方法。这里实际不再是"原地"对列表进行排序,而只是按特定的顺序获取列表的内容。有的时候,你需要更改实际的列表;但有的时候,没有任何副作用的排序显得更"善解人意"。重点在于,现在的写法更简洁,可读性更好(当然是在你理解了语法之后)。我们的想法是"列表按名称排序",现在的代码正是这样做的。并不是"列表通过将一个产品的名称与另一个产品的名称进行比较来排序",就像C# 2代码所做的那样。也不是使用知道如何将一个产品与另一个产品进行比较的另一个类型的实例来按名称排序。这种简化的表达方式是C# 3的核心优势之一。既然单独的数据查询和操作是如此的简单,那么在执行更大规模的数据处理时,仍然可以保持代码的简洁性和可读性,这进而鼓励开发者以一种"以数据为中心"的方式来观察世界。”
最后这两步的语法,绝对是一个会用其它语言比如C/C++,VB的人所无法明白的,C#进化速度真是快。。。。。。。
关于排序,暂时还不知道有没有其它的方法,日后再补记。
参考书籍:《C#与.NET3.5高级程序设计》,《深入解析C#》(C# in depth) 。
另外,这篇文章还提到了另外两种更深入的做法:1,自定义排序,可以提供一个接口,接受一个排序指标,然后对指定List进行排序,2,用LINQ的orderby子句实现排序。
“
”
那么,如何告知系统排序的规则呢?有以下几种方法:
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控制升序和降序。
”
相关文章推荐
- .NET/C#中对自定义对象集合进行自定义排序的方法
- .NET/C#中对自定义对象集合进行自定义排序的方法
- .NET/C#中对自定义对象集合进行自定义排序的方法
- .NET/C#中对对象集合进行查询的方法 以及相关的 Predicate<T> 及 Action<T> 的用法
- .NET/C#中对对象集合进行查询的方法 以及相关的 Predicate<T> 及 Action<T> 的用法
- 对集合中的对象进行排序,用collections.sort 到方法
- .NET/C#中对对象集合进行查询的方法 以及相关的 Predicate<T> 及 Action<T> 的用法
- 对自定义对象集合List中的数据进行排序
- 对List集合中的对象进行自定义排序
- Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库 自定义日志记录功能,按日记录,很方便 C#常量和字段以及各种方法的语法总结 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法 asp.net webapi 自定义身份验证
- java 集合中自定义对象的几种排序方法
- C#中List或其它集合对象排序方法的一点理解
- 对于集合中的自定义对象使用collections.sort 进行排序,需要实现compartor接口
- [原创]详述IComparer,IComparable接口,实现自定义方法比较对象大小并排序(C#)
- 对于集合内装载的对象数据进行自定义排序 !
- 重写Compare方法对集合以指定对象的属性进行排序
- Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法
- Java 往TreeSet集合中存储自定义对象学生,按照学生的年龄进行排序。
- Java:对集合中的对象进行排序需要实现Interface Comparable接口并实现int compareTo(T o)方法
- 重写Compare方法对集合以指定对象的属性进行排序