如何对包含属性的类的List集合进行排序?

9

我有一个类的列表,像这样:

List<MyClass> test = new List<MyClass>();

在我的类中,我只有一些属性。
public string id {get; set;}
public DateTime date {get; set;}

现在我通过从2个不同的数据库表中获取一些查询来创建这些类。然后,我从数据库表中取出这两个结果,并使用foreach循环创建一个新的MyClass对象,并将其放入我的“test”集合中。
现在,一旦所有这些类都放入列表集合中,我想排序并按“日期”属性对类进行排序。
我该如何做?我不能在从数据库获取它们时立即对它们进行排序,因为我是从2个不同的数据库表中获取它们的,分别进行排序只会使每个部分都有序,但第一个表可能有12/12/2009,第二个表也可能有。所以它们需要一起排序。
那么我可以使用linq或其他东西来排序吗?
谢谢
3个回答

22

这样怎么样:

list.Sort((x,y) => DateTime.Compare(x.date, y.date));

使用现有列表进行排序,或:

var sorted = list.OrderBy(x=>x.date).ToList();

该函数创建了第二个列表。


就像我之前提到的,我在发布之前尝试过第二种方法,但没有使用.ToList()。所以orderBy总是会创建一个新列表,而sort则不会? - chobo2
1
是的。List.Sort会就地对列表进行排序,因此原始列表会被更改。LINQ(第二种方法)创建一个新的可枚举对象。通过添加“ToList”,您可以将其转换为List<MyClass>而不是IEnumerable<MyClass>。如果您只是要在foreach循环中使用结果,则可以省略“ToList()”方法。 - Reed Copsey
我们可以对类型为字符串的属性甚至叫做“名称”进行排序......就像下面这样..... var list2 = list1.where(o=>o.Name.contains("test")).orderby(o=>o.Name).Take(10).toList(); - mandava

3
如果您想在原地对它们进行排序,可以使用 List<T>.Sort
test.Sort( (l,r) => l.date.CompareTo(r.date) );

如果您想将它们排序并放入新的结果集中,LINQ非常好用:
var sortedResults = from mc in test
                    order by mc.date
                    select mc;

2

一旦你在列表中拥有你的课程,并且列表已经完成:

List<MyClass> testList = new List<MyClass>();
// populate the list...

var orderedList = testList.OrderBy( x => x.date ).ToList();

啊,我试过了,但是没有在它后面加上 .ToList()。我看到有些人使用比较函数,这会带来任何优势或其他东西吗? - chobo2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接