有2个列表
我需要根据list_in
对ptdPoints进行排序我目前的代码如下: -
List<int> list_int = new List<int>() {1,9,3};
List<PointF> ptdPoints= new List<PointF>();
ptdPoints.Add(new PointF(20,10));
ptdPoints.Add(new PointF(10,80));
ptdPoints.Add(new PointF(60,30));
如何根据list_int
的升序排序list_int和ptdPoints这里的结果如下=&gt;
所以我按升序排列list_int,其他索引中的相应值也会改变。
任何帮助都将不胜感激。
答案 0 :(得分:7)
无论你想做什么,如果你把两个列表的数据放在一个对象和一个列表中,然后对这个列表进行排序,它可能是一个更好的解决方案。
像这样(未经测试,即时书写):
class OrderedPoint
{
public int Order {get;set;}
public PointF Point {get;set;}
public static int CompareByOrder(OrderedPoint x, OrderedPoint y)
{
return x.Order.CompareTo(y.Order);
}
}
List<OrderedPoint> list;
// TODO: Fill it
list.Sort(OrderedPoint.CompareByOrder);
答案 1 :(得分:3)
这将有效,但前提是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();
您基本上将两个列表合并为一个匿名对象,对第一个列表的元素进行排序并仅输出第二个列表。请注意,这将不更改原始列表。
修改:有关此工作原理的详细信息,您可以在these entries on LINQ上阅读Zip和此内容。
order.Zip(ptdPoints, (left, right) => new {left, right})
这一行将以有序的方式获取order
列表和'zip'(这意味着第一个列表的第一个元素与第一个列表中的第一个,依此类推)。 (left, right) => new {left, right}
是一个匿名函数,它从第一个列表(left
)和第二个列表(right
)中获取一个元素,并输出一个包含两个成员的新匿名对象:{{ 1}}和int left
。
PointF right
OrderBy
指定您希望执行哪些对象属性。在第一行之后,函数.OrderBy(a => a.left)
的输入将是之前创建的匿名对象。然后我们说:从这些元素中,根据a => a.left
属性对它们进行排序。由于这是一个连接点和原始整数的匿名对象,因此对匿名对象上的整数进行排序将根据整数对点进行排序。
left
Select
将一个对象投射到另一个对象中。这一行说:从现在开始,我想只操纵我的匿名对象的.Select(a => a.right)
属性中的对象,实际上将您的匿名对象投射到原始的right
列表中。
下一步是在此序列中创建一个新列表。
答案 2 :(得分:1)
ptdPoints.Select((o, i) => new { Point = 0; Int = order[i] }).OrderBy(a => a.Int).Select(a => a.Point);