Мне нужен набор, который ведет себя как Набор и сохраняет порядок вставки элемента.
Есть ли один, или я должен буду реализовать его сам?
Какова лучшая реализация была бы?
Он не существует в .NET, но его можно эмулировать, используя List
и метод расширения LINQ Distinct
, который должен сохранять порядок базового List
.
Будет ли 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; } }
}