Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对列表进行排序<;对象>;填充了没有LINQ的匿名类型 Random r=new Random(); List myList=新列表(); 对于(int i=0;iobj1.A.CompareTo(obj2.A));_C#_List_Sorting_Lambda - Fatal编程技术网

C# 对列表进行排序<;对象>;填充了没有LINQ的匿名类型 Random r=new Random(); List myList=新列表(); 对于(int i=0;iobj1.A.CompareTo(obj2.A));

C# 对列表进行排序<;对象>;填充了没有LINQ的匿名类型 Random r=new Random(); List myList=新列表(); 对于(int i=0;iobj1.A.CompareTo(obj2.A));,c#,list,sorting,lambda,C#,List,Sorting,Lambda,上面的代码定义了一个通用的列表an,用100个匿名变量填充它,其中有两个成员,a和B 假设我想对A上的myList进行排序。最后一行尝试对列表进行排序,但是这段代码显然无法编译,因为编译器不知道对象列表包含什么 如果不使用LINQ,是否可以使用lambda或类似工具对该列表进行排序?首先,如果非常小心地使用隐式键入,可以使用LINQ: Random r = new Random(); List<object> myList = new List<object>(); f

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

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


如果不使用LINQ,是否可以使用lambda或类似工具对该列表进行排序?

首先,如果非常小心地使用隐式键入,可以使用LINQ:

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) );
其次,如果您愿意使用
动态
,请将列表键入
列表
,然后您可以直接使用LINQ


然而,我真的不明白你为什么坚持使用匿名类型。只需创建一个标称类型,就可以享受强大的类型、编译时安全性和LINQ的荣耀

只要您使用
var
语法将列表声明为匿名类型的对象列表,或者愿意使用
dynamic
,就可以在没有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) );
Random r=new Random();
List myList=新列表();
对于(int i=0;i<100;i++)
Add(新的{A=r.Next(),B=r.Next()});
myList.Sort((obj1,obj2)=>obj1.A.CompareTo(obj2.A));

LINQ中没有魔法-您可以查看所有方法签名,并了解如何计算类型

您需要这样的内容来创建类型列表(类似于
ToList()
extension):

List新列表(T忽略)
{
返回新列表();
}
并将其用作

List<T> NewList<T>(T ignored)
{
    return new List<T>();
}
Random r=new Random();
var myList=NewList(new{A=r.Next(),B=r.Next()});
对于(int i=0;i<100;i++)
Add(新的{A=r.Next(),B=r.Next()});
myList.Sort((obj1,obj2)=>obj1.A.CompareTo(obj2.A));

@Jason我重新阅读了答案,意识到第一部分可能会让人困惑,所以我提到了
var
+1。要使用强类型版本,请参阅我的答案(据我所知,需要助手方法),这对我帮助很大。非常感谢你。
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) );