2014-09-29 36 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); 
     } 
    } 
} 
相关问题