В.NET существует ли отсортированный тип набора?

25
задан Eclipse 7 December 2009 в 18:05
поделиться

6 ответов

Вы могли бы хотеть смотреть на Наборы Питания Wintellect . Это доступно на CodePlex и содержит довольно много наборов, которые очень полезны. Набор OrderedBag в проекте точно, что Вы ищете. Это по существу использует красно-черное дерево для обеспечения довольно эффективного вида.

20
ответ дан JeremiahClark 28 November 2019 в 21:48
поделиться

Я расширил бы Ваш собственный класс списка, который, поскольку Вы упомянули, просто виды после каждой вставки. Так как Ваши вставки являются нечастыми, хит производительности был бы минимален, и сортировка почти отсортированного списка быстра в любом случае. Расширьте Универсальный Список и переопределите Добавить метод к виду сразу. Если производительность становится проблемой, можно вставить на месте, чтобы сэкономить некоторое время. Кроме того, можно стоять в очереди вставки, чтобы сделать единственную пересекающуюся вставку для всех значений, которые Вы хотите вставить.

3
ответ дан Joe Basirico 28 November 2019 в 21:48
поделиться

Как я упомянул ранее сегодня здесь , , Библиотека Универсального набора C5 имеет надлежащий контейнер для Вас.

2
ответ дан Community 28 November 2019 в 21:48
поделиться

Если ключ является также атрибутом объекта, Вы могли бы попробовать System.Collections.ObjectModel.KeyedCollection<TKey, TItem>. Это - абстрактный класс, но если Ваш ключ является просто свойством объекта тогда, это реально простой произойти из.

-1
ответ дан Joel Coehoorn 28 November 2019 в 21:48
поделиться

Вот старый прием, я использовал путь назад в VB6 для сортировки вещей в алфавитном порядке: Используйте Систему. Windows. Формы объект ListBox и набор его свойство "Sorted" к истинному. В C# можно вставить любой объект в поле списка, и это отсортирует объект в алфавитном порядке по его ToString () значение:

для модуля класса:

<час>

Система использования. Windows. Формы;

    static void Main(string[] args)
    {
        ListBox sortedList = new ListBox();
        sortedList.Sorted = true;

        sortedList.Items.Add("foo");
        sortedList.Items.Add("bar");
        sortedList.Items.Add(true);
        sortedList.Items.Add(432); 

        foreach (object o in sortedList.Items)
        {
            Console.WriteLine(o);
        }

        Console.ReadKey();
    }
<час>

Это отобразится:

432
панель
нечто
Верный

-15
ответ дан Perry Pederson 28 November 2019 в 21:48
поделиться

Если вы просто хотите придерживаться стандартных коллекций, тогда функция Sort (IComparer <>) класса List <> подходит для часто игнорируется. Все, что вам нужно сделать, это создать подходящий Comparer <> для ваших объектов. Например:

public class PositionDateComparer : IComparer<VehiclePosition>
{
    public int Compare(VehiclePosition x, VehiclePosition y)
    {
        if (x.DateTime == DateTime.MinValue)
        {
            if (y.DateTime == DateTime.MinValue)
            {
                // If x is null and y is null, they're
                // equal. 
                return 0;
            }

            // If x is null and y is not null, y
            // is greater. 
            return -1;
        }

        // If x is not null...
        //
        if (y.DateTime == DateTime.MinValue)
        // ...and y is null, x is greater.
        {
            return 1;
        }

        // ...and y is not null, compare the dates
        //
        if (x.DateTime == y.DateTime)
        {
            // x and y are equal
            return 0;
        }

        if (x.DateTime > y.DateTime)
        {
            // x is greater
            return 1;
        }

        // y is greater
        return -1;
    }
}

Затем просто выполняйте vehiclePositionsList.Sort (new PositionDateComparer ()) всякий раз, когда вы хотите отсортировать список перед доступом к нему. Я понимаю, что это может быть не так просто, как контейнер, который автоматически сортирует каждый раз, когда вы добавляете новый объект, но для многих (например, меня!) Этого может быть достаточно, чтобы успешно выполнить работу, не требуя дополнительных библиотек.

3
ответ дан 28 November 2019 в 21:48
поделиться
Другие вопросы по тегам:

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