-5

有2个清单

  1. list_int
  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

这里结果如下=>

  • 1=>(20,10)
  • 3=>(60,30)
  • 10=>(10,80)

所以我按升序排列 list_int 并且其他索引中的相应值也发生了变化。

任何帮助,将不胜感激。

4

3 回答 3

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);
于 2013-07-19T12:58:41.000 回答
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();

您基本上将两个列表合并为一个匿名对象,对第一个列表的元素进行排序并仅输出第二个列表。请注意,这不会更改原始列表。

编辑:有关其工作原理的详细信息,您可以阅读LINQ 上的这些条目Zip上的这个条目。

order.Zip(ptdPoints, (left, right) => new {left, right})

该行将获取order列表,并以有序的方式“压缩”(这意味着第一个列表的第一个元素与第二个中的第一个元素,依此类推)。这(left, right) => new {left, right}是一个匿名函数,从第一个列表 ( left) 中获取一个元素,从第二个列表 ( right) 中获取一个元素,并输出一个具有两个成员的新匿名对象:int leftPointF right

.OrderBy(a => a.left)

OrderBy指定您希望执行排序的对象属性。在第一行之后,函数的输入a => a.left将是之前创建的匿名对象。然后我们说:从这些元素中,根据left属性对它们进行排序。由于这是一个匿名对象,连接您的点和原始整数,因此对匿名对象上的整数进行排序将根据您的整数对点进行排序。

.Select(a => a.right)

Select将一个物体投射到另一个物体上。这行说:从现在开始,我只想操作right我的匿名对象属性中的对象,基本上将您的匿名对象投影到您的原始PointF列表中。

下一步是从这个序列中创建一个新列表。

于 2013-07-19T13:03:14.410 回答
1
ptdPoints.Select((o, i) => new { Point = 0; Int = order[i] }).OrderBy(a => a.Int).Select(a => a.Point);
于 2013-07-19T13:03:28.223 回答