2013-07-19 2 views
-5

Есть 2 спискаКак сортировать 2 список, основанный на первом списке

  1. list_int
  2. ptdPoints

Мне нужно сортировать ptdPoints на основе list_in

Мой текущий код следующим образом: -

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 и ptdPoints на основе порядке возрастания list_int

Здесь результат выглядит следующим образом =>

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

You basicaly объединяют два списка в анонимный объект, упорядочивая элемент первого списка и выводя только второй список. Обратите внимание, что это будет не изменить исходный список.

Edit: Для получения дополнительной информации о том, как это работает, вы можете прочитать these entries on 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.

Следующий шаг - создать новый список из этой последовательности.

+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); 
Смежные вопросы