整数集的间隔表示c#

时间:2012-02-19 13:14:12

标签: c# hashset intervals

这是我给出的一个赋值,它表示如果哈希集包含值{12, 13, 14, 23, 88, 89, 90, 91},那么它们将被表示 作为间隔{ [12..14], [23..23], [88..91]}的集合。

现在问题,我应该为此使用for-each吗?我有点困惑,因为我不确定你是否可以将几个区间组合成一组,或者是否应该有不同的哈希集?

我确实研究了一些像group-by这样的方法,但我不知道它是否适合使用。

建议或提示表示赞赏!

1 个答案:

答案 0 :(得分:2)

我首先对它们进行排序,然后迭代该有序集合,并组合元素,只要差异只有一个。

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来电。