对列表<对象进行排序>其中填充了匿名类型,而无需 LINQ

本文关键字:类型 LINQ 填充 对象 列表 排序 | 更新日期: 2023-09-27 18:34:49

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 或类似方法以某种方式对此列表进行排序?

对列表<对象进行排序>其中填充了匿名类型,而无需 LINQ

可以在

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

首先,如果您非常谨慎地使用隐式类型,则可以使用 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 的荣耀中!

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