Класс разреженных числовых последовательностей для .NET - PullRequest
3 голосов
/ 27 октября 2010

Мне нужен очень специфический класс, мне бы очень хотелось узнать, существует ли такой класс, поэтому мне не нужно его повторно реализовывать.У меня есть набор предметов.Каждый элемент имеет числовое значение, связанное с ним - вес .Вес каждого предмета уникален в пределах набора.Товары должны быть отсортированы по весу.Вес можно изменить для каждого предмета, но операция по изменению веса является чрезвычайно дорогой.Существует операция, которая выполняется на множестве часто - перемещать диапазон предметов в наборе, изменяя вес предмета.Поэтому мне нужен класс типа List, но со встроенной логикой для управления весом элементов.Последовательность веса должна быть разреженной, чтобы минимизировать столкновения с весом при операциях перемещения и улучшить производительность, сводя к минимуму операции по изменению весаИнтерфейс класса должен выглядеть так:

public abstract class SparsedSequence<T> : IList<T>
{
    // Weight increment for new items.
    private int WeightIncrement = 10000;

    protected abstract void OnWeightChanged(int weight, T item);

    public void MoveRange(int offset, int count, int amount)
    {
        // There must be fancy weight management logic.
    }

    public void MoveRange(T[] range, int amount)
    {
        // Cut T[] to set of calls to MoveRange(int, int, int)
    }

    public int ConstraintAmount(int offset, int count, int amount)
    {
        // Returns amount constrainded by sequence size and 0, 
        // so that moved block will remain within proper range.
        // If returns 0 - block unmovable in that direcion.
    }

    public int ConstraintAmount(T[] range, int amount)
    {
        // ----- " -----
    }

    public void Add(T newItem)
    {
        // Add to sequnce end.
        // Defines new weight and calls OnWeightChanged.
        // NewWeight = Weights[Count - 1] + WeightIncrement.
    }

    public void Add(T item, int weight)
    {
        // Adds item with forced weight.
    }

    public T this[int index]
    {
        // Get item
        get { ... }
    }

    public IList<int> Weights
    {
        // Get items weights
        get { ... }
    }

    public KeyValuePair<int, T> this[int index]
    {
        // Get item and weight
        get { ... }
    }

    // Remove, clear, insert, indexof etc.
}

Не найдено ничего похожего в framework или PowerCollections.Я полагаю, вы уже поняли, что я собираюсь использовать этот класс для управления упорядоченными операциями набора записей в базе данных :) Спасибо.

1 Ответ

1 голос
/ 29 октября 2010

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

...