如何根据第一个列表对2个列表进行排序

时间:2013-07-19 12:56:06

标签: c# linq list c#-4.0 sorting

有2个列表

  1. list_int
  2. ptdPoints
  3. 我需要根据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;

    • 1 =&gt;(20,10)
    • 3 =&GT;(60,30)
    • 10 =&GT;(10,80)

    所以我按升序排列list_int,其他索引中的相应值也会改变。

    任何帮助都将不胜感激。

3 个答案:

答案 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);