.NET的稀疏排序数字序列类

时间:2010-10-27 11:01:37

标签: .net sequence ilist sparse-matrix sorted

我需要非常具体的课程,我真的想知道是否有现成课程,所以我不必重新实施它。 我有一套物品。每个项目都有一个与之关联的数字 - 重量。每个项目的重量在集合内是唯一的。物品必须按重量分类。可以为每个项目修改重量,但改变重量的操作非常昂贵。有一个操作,它通过设置频繁执行 - 通过修改项目的权重来移动集合中的项目范围。 所以我需要一个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.
}

在框架或PowerCollections中未发现任何类似内容。我猜你已经想通了我打算用这个类来管理数据库有序记录集操作:) 感谢。

1 个答案:

答案 0 :(得分:1)

您可以在内部使用SortedList<int, T>。它不允许您修改键,但是当您想要修改项目的重量时,您可以删除旧重量的项目并再次插入新的重量。我不确定这是否会导致太多的性能损失。