2013-07-20 5 views
3

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

Один из счетчиков перечисляет интервалы очень быстро, но в несколько произвольном порядке. Другой перечисляет их в лексикографическом порядке, но немного медленнее (в зависимости от интервалов). В зависимости от того, что вы пытаетесь достичь, один перечислитель может предпочесть друг другу.

Есть ли способ разрешить пользователю решить, какой перечислитель следует использовать, например, в цикле foreach? Если нет, я мог бы легко иметь свойство, используемое для переключения между счетчиками, или конструктор мог бы взять дополнительный параметр. Но я немного боюсь, что это вызовет больше путаницы, чем удобство.

Должен ли я, для другого перечислителя, создать отдельный метод, который возвращает IEnumerator? Есть ли наилучшая практика для этой маленькой странной проблемы?

ответ

8

Отображение двух свойств, которые возвращают разные счетчики, вероятно, является правильным путем. Вместо того, чтобы ваша структура данных реализовала сам IEnumerable (я угадываю с этим), создайте две разные версии IEnumerator и поделитесь с основным классом для каждого из них. Тогда код использования прост:

foreach(var item in data.FastEnumerator) 
{ 
    .... 

foreach(var item in data.LexicalEnumerator) 
{ 
    .... 
+0

Блестящая идея! На самом деле нравится :) Поскольку структура данных является частью библиотеки коллекций C5 Generic, она должна реализовать IEnumerable . Я сделал обычный счетчик коллекции быстрой, «несортированной» версией. Сортированная версия раскрывается с помощью метода GetEnumeratorSorted и свойства Sorted, поэтому коллекция может быть перечислена в цикле, как «foreach (интервал var в коллекции.Sorted) {} ​​'. Работает как шарм: D –

+0

Вы не можете использовать foreach на IEnumerator, так как он требует IEnumerable просто для ожидаемого метода GetEnumerator. –

Смежные вопросы