这将起作用,但前提是order
列表与列表大小相同ptdPoints
:
List<int> order = new List<int>() { 1, 9, 3 };
List<PointF> ptdPoints = new List<PointF>() { new PointF(20, 10), new PointF(10, 80), new PointF(60, 30) };
var result = order.Zip(ptdPoints, (left, right) => new {left, right})
.OrderBy(a => a.left)
.Select(a => a.right)
.ToList();
您基本上将两个列表合并为一个匿名对象,对第一个列表的元素进行排序并仅输出第二个列表。请注意,这不会更改原始列表。
编辑:有关其工作原理的详细信息,您可以阅读LINQ 上的这些条目和Zip上的这个条目。
order.Zip(ptdPoints, (left, right) => new {left, right})
该行将获取order
列表,并以有序的方式“压缩”(这意味着第一个列表的第一个元素与第二个中的第一个元素,依此类推)。这(left, right) => new {left, right}
是一个匿名函数,从第一个列表 ( left
) 中获取一个元素,从第二个列表 ( right
) 中获取一个元素,并输出一个具有两个成员的新匿名对象:int left
和PointF right
。
.OrderBy(a => a.left)
OrderBy
指定您希望执行排序的对象属性。在第一行之后,函数的输入a => a.left
将是之前创建的匿名对象。然后我们说:从这些元素中,根据left
属性对它们进行排序。由于这是一个匿名对象,连接您的点和原始整数,因此对匿名对象上的整数进行排序将根据您的整数对点进行排序。
.Select(a => a.right)
Select
将一个物体投射到另一个物体上。这行说:从现在开始,我只想操作right
我的匿名对象属性中的对象,基本上将您的匿名对象投影到您的原始PointF
列表中。
下一步是从这个序列中创建一个新列表。