Интервальное представление целого множества c # - PullRequest
1 голос
/ 19 февраля 2012

Это задание, которое мне дано, оно говорит, что если хеш-набор содержит значения {12, 13, 14, 23, 88, 89, 90, 91}, то они будут представлены как набор интервалов { [12..14], [23..23], [88..91]}.

Теперь к вопросу, я должен использовать для каждого для этого?Я немного сбит с толку, так как не уверен, что вы можете сгруппировать несколько интервалов в один набор, или должны быть разные хэш-наборы?

Я рассматривал некоторые методы, такие как группировка, но я не знаю, подходит ли это для использования.

Советы или подсказки приветствуются!

1 Ответ

2 голосов
/ 19 февраля 2012

Я бы сначала отсортировал их, а затем итерировал этот упорядоченный набор и комбинировал элементы, если разница только одна.

IEnumerable<Tuple<int,int>> GetIntervals(IEnumerable<int> seq)
{
    var orderedSet=seq.OrderBy(i=>i);
    bool first=true;
    int startOfInterval=0,endOfInterval=0;
    foreach(var element in orderedSet)
    {
      if(first)
      {
        startOfInterval=element;
        endOfInterval=element;
        first=false;
      }
      else
      {
        if(element==endOfInterval+1)
          endOfInterval=element;
        else
        {            
          yield return Tuple.Create(startOfInterval, endOfInterval);
          startOfInterval=element;
          endOfInterval=element;
        } 
      }
    }
    yield return Tuple.Create(startOfInterval, endOfInterval);
}

void Main()
{
  var input=new int[]{12, 13, 14, 23, 88, 89, 90, 91};
  GetIntervals(input).Dump();
}

Обратите внимание, что для этого требуются различные элементы на входе. Если вход является хэш-набором, это гарантировано. В противном случае добавьте вызов Distict() перед вызовом OrderBy.

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