对没有LINQ的匿名类型的List 进行排序

Random r = new Random(); List myList = new List(); for (int i = 0; i  obj1.A.CompareTo(obj2.A) ); 

上面的代码定义了一个通用List ,用100个匿名变量填充它,有两个成员A和B.

假设我想在A上对myList进行排序。最后一行尝试对列表进行排序,但是这段代码显然不能编译,因为编译器不知道对象列表包含什么。

不使用LINQ,是否可以使用lambda或类似方法对此列表进行排序?

只要您设法使用var语法将列表声明为匿名类型对象列表,或者愿意使用dynamic ,就可以在没有LINQ的情况下对其进行排序:

 Random r = new Random(); List myList = new List(); for (int i = 0; i < 100; i++) myList.Add(new { A = r.Next(), B = r.Next() }); myList.Sort( (obj1, obj2) => obj1.A.CompareTo(obj2.A) ); 

首先,如果您非常小心地使用隐式类型,则可以使用LINQ:

 var myList = Enumerable.Range(0, 100) .Select(index => new { A = r.Next(), B = r.Next() }) .ToList(); myList.Sort( (obj1, obj2) => obj1.A.CompareTo(obj2.A) ); 

其次,如果您愿意使用dynamic ,请将列表键入List ,然后您可以直接使用LINQ。

但是,我真的不明白为什么你坚持要粘在匿名类型上。 只需做一个名义上的类型,并享受强类型,编译时安全性和LINQ的荣耀!

LINQ中没有魔法 – 您可以查看所有方法签名并查看类型是如何计算出来的。

你想要这样的东西来创建你的类型列表(类似于ToList()扩展名):

 List NewList(T ignored) { return new List(); } 

并用它作为

 Random r = new Random(); var myList = NewList(new { A = r.Next(), B = r.Next() }); for (int i = 0; i < 100; i++) myList.Add(new { A = r.Next(), B = r.Next() }); myList.Sort( (obj1, obj2) => obj1.A.CompareTo(obj2.A) );