2012-02-19 57 views
1

這是我給出的一個任務,它表示如果散列集包含值{12, 13, 14, 23, 88, 89, 90, 91}那麼它們將被表示爲 ,作爲間隔集合{ [12..14], [23..23], [88..91]}整數集合c的區間表示

現在的問題,我應該使用for-each爲這個?我有點困惑,因爲我不確定是否可以將幾個區間分成一組,或者應該有不同的哈希集?

我確實看過一些像group-by的方法,但我不知道它是否正確使用。

建議或提示感謝!

+0

可能相關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

+3

可能使用[使用LINQ將一組數字序列無間隔]重複(http://stackoverflow.com/questions/4681949/use-linq-to-group-a-sequence-of-numbers-with-no-缺口) – dtb 2012-02-19 13:27:52

回答

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(); 
} 

請注意,這需要不同的輸入元素。如果輸入是一個哈希集,這是有保證的。在致電OrderBy之前,請致電Distict()

+1

不要忘記添加一個最終的'yield' _after_你的循環;否則,你會錯過最後的時間間隔。 (但是,請檢查序列是否爲空;如果是,則可以「產生突破」。) – Douglas 2012-02-19 13:22:33

+0

現在已經過測試,至少對於給定示例它至少起作用。 – CodesInChaos 2012-02-19 13:27:19

+0

.Dump()不存在。至少對於我來說。 – saturn 2012-02-19 13:49:08