Есть ли в .NET простой способ создания списков переполнения? - PullRequest
6 голосов
/ 26 ноября 2011

Я хочу добавить «недавно открытую» функциональность в мое приложение, и мне было интересно, есть ли простой встроенный способ создания списков, которые «переполняются». Под этим я подразумеваю, что при добавлении элемента, превышающего возможности списка, все элементы смещаются.

Пример кода желаемой функциональности (очевидно, это не так, список будет содержать A, B, C):

List<string> list = new List<string>();

//if Overflow was 2

list.Add("A");
list.Add("B");
//List now contains A,B
list.Add("C");
//List now contains B,C

Извините за простой вопрос. Сама проблема очевидна для решения (изначально планировалось унаследовать от List), я просто не люблю заново изобретать колесо и путать будущих программистов с пользовательскими объектами, когда язык или инфраструктура обладают такой функциональностью.

Ответы [ 3 ]

5 голосов
/ 26 ноября 2011

Насколько я знаю, в библиотеке нет такой коллекции.
Вы можете написать это очень легко, основываясь на List<> или массиве.

// untested
class OverFlowList<T>
{
    T[] _data;
    int _next = 0;

    public OferflowList(int limit)
    {
        _data = new T[limit];
    }

    void Add(T item)
    {
        _data[_next] = item;
        _next = (_next + 1) % _data.Length;
    }    
}
4 голосов
/ 26 ноября 2011

Вы можете сделать это легко с помощью LinkedList<T>:

LinkedList<string> list = new LinkedList<string>();

//if Overflow was 2
list.AddFirst("A");
list.AddFirst("B");
list.AddFirst("C");
list.RemoveLast();

Я бы лично обернул это в класс, который вы могли бы использовать, например:

public class OverflowCollection<T> : IEnumerable<T>
{
    private int max;
    private LinkedList<T> list = new LinkedList<T>();

    public OverflowCollection(int maxItems)
    {
        this.max = maxItems;
    }

    public void Add(T item)
    {
        this.list.AddFirst(item);
        if (this.list.Count > max)
           this.list.RemoveLast();
    }

    // Implement IEnumerable<T> by returning list's enumerator...
}

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

0 голосов
/ 26 ноября 2011

Используйте пользовательский класс, который реализует IList , затем при реализации метода Add проверьте свое ограничение и сделайте это.

...