범위

2012-08-14 6 views
2

에 숫자 시퀀스로 변환 I가 C#에서 다음 문자열 :범위

1-1022456688100-105,140,199 그룹화 :

string a="1,2,3,4,5,6,7,8,9,10,22,45,66,88,100,101,102,103,104,105,140,199"; 

나는 다음과 같은 출력을 생성하고 싶습니다 이런 식으로 범위에 연속 숫자를 입력하십시오.

"initialnumber-endnumber"와 같이 나머지는 그대로 두십시오.

내게이 문제를 알려주시겠습니까?

미리 감사드립니다.

+4

같이 부를 것이다 분명

public static string GetRangedList(string list) { var numbers = list.Split(',').Select(int.Parse()).OrderBy(i => i); return string.Join(",", GetRanges(numbers)); } 

, 같이 함께 넣을 수 있습니다 그리고 우리가 도와 드리겠습니다 어디서나 당신은 붙어 있습니다. – cadrell0

+1

http://stackoverflow.com/questions/4659511/code-golf-numeric-ranges – SLaks

+0

@SLaks : 파이썬이 될 것 같습니다. OP의 답변을 고려할 때이 질문에 적합하지 않은 것 같습니다. – Tigran

답변

3
IEnumerable<string> Rangify(IList<int> input) { 
    for (int i = 0; i < input.Count;) { 
     var start = input[i]; 
     int size = 1; 
     while (++i < input.Count && input[i] == start + size) 
      size++; 

     if (size == 1) 
      yield return start.ToString(); 
     else if (size == 2) { 
      yield return start.ToString(); 
      yield return (start + 1).ToString(); 
     } else if (size > 2) 
      yield return start + " - " + (start + size - 1); 
    } 
} 
+0

유용한 답변 슬랙 스에 감사드립니다! – Jose3d

+0

나는 이것을 사용하여 객체 목록을 범위에 결합했습니다. 잘 작동한다. 감사! – Corgalore

1

좋습니다. 첫 번째 단계는 정렬 된 정수로 문자열을 열거합니다.

var numbers = a.Split(',').Select(int.Parse()).OrderBy(i => i); 

그렇다면이 두 함수를 사용하여 다음과 같은 범위를 열거 할 수 있습니다.

private static string RangeToString(int first, int last) 
{ 
    if (last != first) 
    { 
     return string.Format("{0}-{1}", first, last); 
    } 
    else 
    { 
     return last.ToString(); 
    } 
} 

private static IEnumerable<string> GetRanges(IEnumerable<int> numbers) 
{ 
    var last = numbers.First(); 
    var first = last; 
    foreach(var number in numbers.Skip(1)) 
    { 
     if (lastNumber + 1 != number) 
     { 
      yield return RangeToString(first, last); 
      first = number; 
     } 

     last == number; 
    } 

    yield return RangeToString(first, last); 
} 

그런 다음 우리는 당신이 시도 당신이 우리를보기이

var b = GetRangedList(a); 
+0

감사합니다. – Jose3d