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或类似方法对此列表进行排序?
答案 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) );