Установите набор, сохраняющий порядок вставки

Мне нужен набор, который ведет себя как Набор и сохраняет порядок вставки элемента.

Есть ли один, или я должен буду реализовать его сам?

Какова лучшая реализация была бы?

5
задан Konstantin Spirin 5 March 2010 в 03:42
поделиться

2 ответа

Он не существует в .NET, но его можно эмулировать, используя List и метод расширения LINQ Distinct, который должен сохранять порядок базового List.

2
ответ дан 14 December 2019 в 19:10
поделиться

Будет ли OrderedDictionary делать то, что вы хотите?

Хотя он не является общим (то есть все, что он возвращает, должно быть приведено или разгруппировано) и является словарем (а не множеством), он будет вести себя так, как вы хотите. Вы можете просто использовать произвольное значение, например null или true в качестве значения, а ключами будут члены вашего набора.

Вот возможная реализация:

public class OrderedSet : ICollection, IEnumerable
{
    OrderedDictionary dict = new OrderedDictionary();
    public void Add(object member)
    {
        dict.Add(member, null);
    }
    public void Clear()
    {
        dict.Clear();
    }
    public void CopyTo(Array array, int index)
    {
        for (int i = 0; i < Count; i++)
            array[i + index] = dict[i];
    }
    public bool Contains(object member)
    {
        return dict.Contains(member);
    }
    public void Insert(int index, object member)
    {
        dict.Insert(index, member, null);
    }
    public void Remove(object member)
    {
        dict.Remove(member);
    }
    public void RemoveAt(int index)
    {
        dict.RemoveAt(index);
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return dict.Keys.GetEnumerator();
    }

    public int Count { get { return dict.Count; } }
    public ICollection Members { get { return dict.Keys; } }
    bool ICollection.IsSynchronized { get { return dict.IsSynchronized; } }
    object ICollection.SyncRoot { get { return dict.SyncRoot; } }
}
2
ответ дан 14 December 2019 в 19:10
поделиться
Другие вопросы по тегам:

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