Список <> владеет компаратором

У меня есть Список, где элемент:

struct element { 
                double priority; 
                int value; 
               }

Как я могу реализовать свой собственный компаратор, которые позволяют мне Список вида приоритетом? Я пробую SortredList..., но он не позволяет douplicated ключи :(

Большое спасибо за справку!

5
задан Andrey 24 March 2010 в 16:28
поделиться

5 ответов

Если вы не можете полагаться на расширения 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();
}
3
ответ дан 18 December 2019 в 06:34
поделиться

Предполагается, что C # 3 или новее:

var sorted = MyList.OrderBy(e => e.priority);
10
ответ дан 18 December 2019 в 06:34
поделиться

Если вы хотите отсортировать сам список без создания нового экземпляра, вы можете реализовать IComparer, а затем вызвать List.Sort с экземпляром вашей реализации

public class ElementComparer : IComparer<element>
{
    public int Compare(element x, element y)
    {
        throw new NotImplementedException();
    }
}
1
ответ дан 18 December 2019 в 06:34
поделиться

Вы можете выполнить сортировку на месте с помощью перегрузки 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); });
8
ответ дан 18 December 2019 в 06:34
поделиться

Это зависит от того, хотите ли вы отсортировать сам список или получить значения в отсортированном порядке (без изменения списка).

Для сортировки самого списка (предположим, что у вас есть 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);
2
ответ дан 18 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: