排序列表 充满匿名类型,而LINQ(Sorting a List<object>

2019-09-17 09:36发布

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的与两个部件A和B 100个匿名变量填充它

比方说,我要排序myList中的A.最后一行试图对列表进行排序,然而这显然代码不编译,因为编译器不知道哪些对象的列表包含。

如果不使用LINQ,是否有可能以某种方式进行排序使用Lambda或类似这个名单?

Answer 1:

它可以在不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) );


Answer 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!



Answer 3:

有一个在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) );


文章来源: Sorting a List filled with anonymous types without LINQ