2015-06-02 1 views
0

Я хотел вставить точку пересечения края где-то на краю, но край мог бы иметь точку пересечения раньше. Поэтому я хотел отсортировать точки пересечения между Edge.Start до Edge.Finish (это Point).Как отсортировать список <T> в результате функции?

для сортировки я использую parametric T уравнение, функция выглядит следующим образом:

/// <summary> 
/// Get the value of T between startPoint and endPoint 
/// </summary> 
/// <param name="position">The intersection of edge</param> 
/// <param name="startPoint">Start point of edge</param> 
/// <param name="endPoint">End Point of edge</param> 
/// <returns></returns> 
public static double calculateT(Point position, Point startPoint, Point endPoint){ 
    return (position.X - startPoint.X)/(startPoint.X - endPoint.X); 
} 

и некоторые, где в MainWindow.xaml.cs я получил это:

//there are some another intesection vertices 

Node anotherPointer = new Node(); //pointer 

//prev is node that points to start point of edge 
//cur is node that points to end point of edge 
//nodes is new node that wanted to inserted 

//collection of intersection 
List<Node> nodes = new List<Node>(); 


nodes.Add(node); //add the new intersection to the list 

//grab all intersection between start point until end point 

anotherPointer = prev.Next; 
while (anotherPointer != cur) { 
    nodes.Add(anotherPointer); 
    anotherPointer = anotherPointer.Next; 
} 

//how to sort nodes? 

проблема мне нужно три параметра в вычислить T пересечения. как правильно подобрать nodes по функции calculateT?

Примечание

Вот мой класс узел.

public class Node { 
    Point info; 
    Node next; 
} 
+0

Вы можете просто использовать условие OrderBy (x => здесь), то, которое вы написали выше, или просто передать точку своей функции, например x => calculateT (x.Point, startPoint, endPoint) – Coder1409

+0

no 'OrderBy' функция внутри: 'node' .. (: –

+0

добавить с помощью System.Linq; – Coder1409

ответ

4

Вы пробовали это?

nodes.OrderBy(node => calculateT(...)) 

(я не знаю, как вы получите параметры для calculateT, но вы получите идею)

+0

нормально, но функция' OrderBy' внутри 'nodes' .. (: –

+0

' OrderBy' является методом расширения. Вам понадобится пространство имен 'System .Linq', чтобы он появился (добавьте его в операторы 'using' в начале файла). Будьте осторожны, так как он не будет изменять список, он просто вернет упорядоченный' IEnumerable '. сделайте с ним все, что хотите, включая преобразование его в «Список » (с использованием метода ToList() ', точно подходящего). – Falanwe

+0

' OrderBy' предоставляется Linq as метод расширения 'List <>'. – Konamiman

2

List<T> предоставляет метод Sort вы можете использовать. Эта перегрузка принимает делегата Comparison<T> в качестве параметра, поэтому вам нужно собрать такой делегат из вашего метода calculateT.

nodes.Sort((node1, node2) => calculateT(/* parameters using Node1 */).CompareTo(calculateT(/* parameters using Node2 */); 

Обратите внимание, что если вы хотите, чтобы ваш nodes список, чтобы всегда быть отсортирован, используя этот метод, вы можете захотеть использовать SortedList<T>.

+0

Почему он использовал это, когда есть OrderBy – Coder1409

+0

@ Coder1409, потому что OrderBy не сортирует список, он создает новый новый 'IEnumerable', не меняя' List'. Который может или не может быть тем, что требует OP, но, разумеется, он не просил. – Falanwe

+0

хорошо, спасибо, это тоже работает ... спасибо за помощь ... :) +1 –

Смежные вопросы