У меня есть Список, где элемент:
struct element {
double priority;
int value;
}
Как я могу реализовать свой собственный компаратор, которые позволяют мне Список вида приоритетом? Я пробую SortredList..., но он не позволяет douplicated ключи :(
Большое спасибо за справку!
Если вы не можете полагаться на расширения C # 3 или Lambdas, тогда ваша структура может реализовать интерфейс IComparable , например:
struct element : IComparable
{
double priority;
int value;
public element(int val, double prio)
{
priority = prio;
value = val;
}
#region IComparable Members
public int CompareTo(object obj)
{
// throws exception if type is wrong
element other = (element)obj;
return priority.CompareTo(other.priority);
}
#endregion
}
Есть также безопасная версия этого интерфейса, но принцип тот же
После того, как вы реализовали этот интерфейс в своей структуре или классе, вызовите метод Sort в List <>
будет "просто работать"
static void Main(string[] args)
{
Random r = new Random();
List<element> myList = new List<element>();
for (int i = 0; i < 10; i++)
myList.Add(new element(r.Next(), r.NextDouble()));
// List is now unsorted
myList.Sort();
// List is now sorted by priority
Console.ReadLine();
}
Предполагается, что C # 3 или новее:
var sorted = MyList.OrderBy(e => e.priority);
Если вы хотите отсортировать сам список без создания нового экземпляра, вы можете реализовать IComparer, а затем вызвать List.Sort с экземпляром вашей реализации
public class ElementComparer : IComparer<element>
{
public int Compare(element x, element y)
{
throw new NotImplementedException();
}
}
Вы можете выполнить сортировку на месте с помощью перегрузки Sort
, которая принимает Comparison
делегат:
yourList.Sort((x, y) => x.priority.CompareTo(y.priority));
Для более старых версий C # вам потребуется заменить лямбда-выражение на синтаксис делегата старой школы:
yourList.Sort(
delegate(element x, element y) { return x.priority.CompareTo(y.priority); });
Это зависит от того, хотите ли вы отсортировать сам список или получить значения в отсортированном порядке (без изменения списка).
Для сортировки самого списка (предположим, что у вас есть List
, называемый elements
):
elements.Sort((x, y) => x.priority.CompareTo(y.priority));
// now elements is sorted
Эквивалент .NET 2.0:
elements.Sort(
delegate(element x, element y) {
return x.priority.CompareTo(y.priority);
}
);
Чтобы получить отсортированные значения порядок:
var orderedElements = elements.OrderBy(x => x.priority);
// elements remains the same, but orderedElements will retrieve them in order
В .NET 2.0 нет эквивалента LINQ, но вы можете написать свой собственный:
public static IEnumerable<T> OrderBy<T>(IEnumerable<T> source, Comparison<T> comparison) {
List<T> copy = new List<T>(source);
copy.Sort(comparison);
foreach (T item in copy)
yield return item;
}
Использование:
Comparison<element> compareByPriority = delegate(element x, element y) {
return x.priority.CompareTo(y.priority);
};
// unfortunately .NET 2.0 doesn't support extension methods, so this has to be
// expressed as a regular static method
IEnumerable<element> orderedElements = OrderBy(elements, compareByPriority);