对没有LINQ </object>的匿名类型的List <object>进行排序

时间:2012-05-22 01:20:58

标签: c# list sorting lambda

Random r = new Random();
List<object> myList = new List<object>();

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) );

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

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

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

3 个答案:

答案 0 :(得分:6)

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

Random r = new Random();
List<dynamic> myList = new List<object>();

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) );

答案 1 :(得分:2)

首先,如果您非常小心地使用隐式类型,则可以使用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<dynamic>,然后您可以直接使用LINQ。

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

答案 2 :(得分:1)

LINQ中没有魔法 - 你可以查看所有方法签名,看看如何弄清楚类型。

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

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

并将其用作

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) );