Выбор коллекции для данных - C#
Формулировка задачи:
Ребята, никак не могу подобрать коллекцию для хранения данных, чтобы (все надо одновременно):
- значения должны быть уникальны (можно Dictionary? или Set?)
- значения должны извлекаться в определенном порядке - (соответственно лучше хранить их отсортированными в этом порядке, так?) - но отсортированы не по ключу, а по одному из критериев внутри value (SortedDictionary отпадает)
- значения нужно добавлять по одному.
- нужен доступ к произвольным значениям, по ключу или по индексу.
Например: люди уникальны по фамилии, но отсортированы по росту.
Пока написала я массив, который вручную сортирую, и при добавлении элемента перезаписываю поэлементно. Но это же извращение. Хочется чего-то эффективного и красивого.
Спасибо!
Решение задачи: «Выбор коллекции для данных»
textual
Листинг программы
public class Test : IEnumerable<TestAnswer>
{
public string Title { get; private set; }
public DateTimeOffset Date { get; private set; }
private SortedSet<TestAnswer> _answers2 = new SortedSet<TestAnswer>(new ByComplexity());
// comparer by complexity
public class ByComplexity : IComparer<TestAnswer>
{
public int Compare(TestAnswer x, TestAnswer y)
{
return x.Question.Complexity.CompareTo(y.Question.Complexity);
}
}
public int ItemsCount2
{
get
{
return _answers2.Count;
}
}
public Test(string title, DateTimeOffset date, TestAnswer[] answers) :
this(title, date)
{
foreach (var x in answers)
{
_answers2.Add(x);
}
}
public Test(string title, DateTimeOffset date)
{
Title = title;
Date = date;
}
public void AddItem(TestAnswer answer)
{
_answers2.Add(answer);
}
public TestAnswer GetItem(int id)
{
return _answers2.First(x => x.Question.Id == id);
}
public IEnumerator<TestAnswer> GetEnumerator()
{
foreach (var s in _answers2)
{
yield return s;
}
}
// non generic
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public override string ToString()
{
StringBuilder result = new StringBuilder();
result.AppendLine(Title);
result.AppendLine(Date.ToString());
result.AppendLine(ItemsCount2.ToString());
foreach (var x in _answers2)
{
if (x != null)
{
result.AppendLine(x.ToString());
}
}
return result.ToString();
}
}