2014-09-29 35 views
0

我有一個如何根據移動範圍對整數列表進行分組?

list<int> = {14, 24, 56,189,909,1000}; 

我想通過一個範圍,使得落入彼此的範圍內的整數是崩潰成一個值崩潰(組?)它們。

所以結果應該是範圍= 100

{14,24,56} //since they 24 falls within 100 of 14 and 56 falls within 100 of 24 
{189} 
{909, 1000} //since they fall within 100 of each other 

我知道這是可能使用LINQ組通過,但我對語法難住了。

我已經看過這個answer,但不能確定用什麼範圍,因爲我只有一個範圍,即100

int[] values = {100, 110, 120, 130, 140, 150, 160, 170}; 
     int[] ranges = {115, 145, 180}; 

    var query = from value in values 
       group value by ranges.Where(x => value >= x) 
            .DefaultIfEmpty() 
            .Last(); 

    foreach (var group in query) 
    { 
     Console.WriteLine("{0}: {{{1}}}", group.Key, 
          string.Join(", ", group)); 
    } 
+0

會的結果是什麼,如果有輸入150?它會成爲第一組還是第二組的一部分? – user2864740 2014-09-29 22:10:22

+1

抱歉錯過了你的問題,如果它是150,它會在兩套。 {14,24,56,150},{150,189}。謝謝。 – Santino 2014-09-29 22:12:46

+1

那麼爲什麼189不是第一組的一部分(因爲189小於150 + 100)? – user2864740 2014-09-29 22:21:53

回答

1

你最好的選擇是使用一個普通的舊的循環,而不是LINQ:

  var l = new[] { 14, 24, 56, 189, 909, 1000 }; 
      var groups = new List<List<int>>(); 
      groups.Add(new List<int>()); 
      groups[0].Add(l[0]); 
      for (int i = 1; i < l.Length; i++) 
      { 
       if (l[i] - l[i - 1] > 100) 
       { 
        groups.Add(new List<int>()); 
       } 
       groups[groups.Count - 1].Add(l[i]); 
      } 
+0

謝謝,這是做到了。讓我從花哨的Linq東西中解脫出來,並以古老的方式去做。非常感激 – Santino 2014-09-29 22:44:38

0

假設您的範圍是有序的:

int[] values = { 100, 110, 120, 130, 140, 150, 160, 170 }; 
int[] ranges = { 115, 145, 180 }; 
var groups = values.GroupBy(x => ranges.First(r => x <= r)); 
+1

'r => x <= r'看起來很有趣。 – Mephy 2014-09-29 22:15:21

+0

實際上我有1個範圍,但沒關係可以只用一個元素數組來使用你的代碼。 – Santino 2014-09-29 22:16:33

1

編輯:這可能不適用,特別是在評論中有額外的要求,因爲它1)僅在一個點開始每個組,並且2)僅將150放置在第一組中。


我可能會寫它,因爲這樣的「動態」範圍(我不知道如何通過集團可以在不同樣參與鬥過程中使用)。該功能要求輸入已經排序。

IEnumerable<IEnumerable<int>> GroupByStartingRange (IEnumerable<int> src) { 
    int? maybeStart; 
    while ((maybeStart = src.FirstOrDefault() != null) { 
     if (maybeStart.HasValue) { 
      var start = maybeStart.Value; 
      yield return src.TakeWhile(x => x <= start + 100) 
      src = src.SkipWhile(x => x <= start + 100); 
     } 
    } 
} 
相關問題