这是我给出的一个赋值,它表示如果哈希集包含值{12, 13, 14, 23, 88, 89, 90, 91}
,那么它们将被表示
作为间隔{ [12..14], [23..23], [88..91]}
的集合。
现在问题,我应该为此使用for-each吗?我有点困惑,因为我不确定你是否可以将几个区间组合成一组,或者是否应该有不同的哈希集?
我确实研究了一些像group-by这样的方法,但我不知道它是否适合使用。
建议或提示表示赞赏!
答案 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
来电。