這是我給出的一個任務,它表示如果散列集包含值{12, 13, 14, 23, 88, 89, 90, 91}
那麼它們將被表示爲 ,作爲間隔集合{ [12..14], [23..23], [88..91]}
。整數集合c的區間表示
現在的問題,我應該使用for-each爲這個?我有點困惑,因爲我不確定是否可以將幾個區間分成一組,或者應該有不同的哈希集?
我確實看過一些像group-by的方法,但我不知道它是否正確使用。
建議或提示感謝!
這是我給出的一個任務,它表示如果散列集包含值{12, 13, 14, 23, 88, 89, 90, 91}
那麼它們將被表示爲 ,作爲間隔集合{ [12..14], [23..23], [88..91]}
。整數集合c的區間表示
現在的問題,我應該使用for-each爲這個?我有點困惑,因爲我不確定是否可以將幾個區間分成一組,或者應該有不同的哈希集?
我確實看過一些像group-by的方法,但我不知道它是否正確使用。
建議或提示感謝!
我首先對它們進行排序,然後迭代那個有序集合,然後組合元素,只要差異只有一個。
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();
}
請注意,這需要不同的輸入元素。如果輸入是一個哈希集,這是有保證的。在致電OrderBy
之前,請致電Distict()
。
不要忘記添加一個最終的'yield' _after_你的循環;否則,你會錯過最後的時間間隔。 (但是,請檢查序列是否爲空;如果是,則可以「產生突破」。) – Douglas 2012-02-19 13:22:33
現在已經過測試,至少對於給定示例它至少起作用。 – CodesInChaos 2012-02-19 13:27:19
.Dump()不存在。至少對於我來說。 – saturn 2012-02-19 13:49:08
可能相關http://stackoverflow.com/questions/7469828/linq-query-to-split-an-ordered-list-into-sublists-of-contiguous-points-by-s- me- c/7470048#7470048 – sehe 2012-02-19 13:25:24
可能使用[使用LINQ將一組數字序列無間隔]重複(http://stackoverflow.com/questions/4681949/use-linq-to-group-a-sequence-of-numbers-with-no-缺口) – dtb 2012-02-19 13:27:52