2013-07-19 51 views
-5

有2列表如何排序表2列出基於第一個列表上的

  1. list_int
  2. ptdPoints

我需要根據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並且在其他索引也改變對應的值。

任何幫助,將不勝感激。

+0

列表2與1無關? – Sayse

+0

我想對第一個列表進行排序,並且相應的列表也應按照相同的順序排序 –

+0

是順序只是y值的順序? – Sayse

回答

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(); 

你basicaly將兩個列表合併爲一個匿名對象,對第一個列表的元素進行排序並僅輸出第二個列表。請注意,這將不是更改原始列表。

編輯:有關如何這項工作,你可以讀了these entries on 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列表中。

下一步是從這個序列創建一個新的列表。

+0

又一次! :P –

+1

@newStackExchangeInstance Ahahah。我們必然要回答同樣的問題。 ;) –

+0

它的工作原理!但PLZ也解釋了它是如何工作的我對這段代碼非常感興趣。 –

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

然後你可能想用代碼來備份它。就目前來看,這看起來像一個簡單的建議,而不是解決問題的問題。 –

+1

@FrédéricHamidi:增加了代碼 –

+0

+1這是最理智的答案,引導原始海報走向良好的習慣。 –

1
ptdPoints.Select((o, i) => new { Point = 0; Int = order[i] }).OrderBy(a => a.Int).Select(a => a.Point); 
相關問題