2014-09-29 2 views
0

은 내가이동 범위에 따라 정수 목록을 그룹화하는 방법은 무엇입니까?

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

내가 (그룹?) 붕괴를 서로의 범위 내에서 가을의 int는 하나 개의 값으로 붕괴되어 있도록 범위로 할 수 있습니다.

그래서 결과는

{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 

(100) 나는 이것이하여 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

는 결과는 무엇을 할 것인가? 그것이 첫 번째 또는 두 번째 그룹의 일부가 될 것인가? – user2864740

+1

미안하지만 귀하의 질문을 놓쳤습니다. 150이라면 두 세트에 모두 포함될 것입니다. {14,24,56, 150}, {150, 189}. 감사. – Santino

+1

그러면 189가 첫 번째 세트의 일부가 아닌 이유는 무엇입니까 (189는 150 + 100 미만 임)? – user2864740

답변

1

당신의 최선의 선택 대신 LINQ의 루프 일반 구를 사용 : 입력 150이 있다면

  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

감사합니다. 멋진 schmancy Linq 물건에서 나를 빼내 낡은 방법으로 평범하게해라. 매우 감사 – Santino

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

+0

실제로 1 범위가 있지만 괜찮 았어 하나의 요소 배열로 코드를 사용할 수 있습니다. – Santino

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); 
     } 
    } 
} 
관련 문제