2017-12-21 15 views
1

의 :LINQ - 문자열의 목록 - 순서 편지들만 한 다음 예를 들어 숫자

이 배열 :

a 2 
a 10 
a 

후 정렬해야한다 :

a 
a 2 
a 10 

나는이 시도 ,하지만 작동하지 않습니다 : 순서가 잘못되었습니다.

... 
.OrderBy(s => s.name) 
.ThenBy(s => { 
    var stringNumber = Regex.Match(s.name, @"\d+").Value; 

    return string.IsNullOrEmpty(stringNumber) 
    ? 0 
    : int.Parse(stringNumber); 
}); 
+1

정확히 "작동하지 않는다"는 것은 무엇을 의미합니까? 그리고 당신의'name'은 항상 다음과 같이 보입니까 : single character-space-number? –

+0

ur 산출물은 무엇입니까 – Raizzen

+0

문제는 처음에는 ** 전체 문자열 **로 정렬하므로,'ThenBy'는 더 이상 효과가 없으므로 문자 만'OrderBy'하고 숫자 만'ThenBy'해야합니다. –

답변

0

당신은 "편지"나는 당신이 만 정렬 문자로, 그때까지 수를한다고 가정했다입니다.

그래서하지 OrderBy에게 전체 문자열을 할 수 있지만 문자로 다음 전체 스트링으로 분류

var result = list 
      .OrderBy(s => s.FirstOrDefault()) // only first character 
      .ThenBy(s => 
      { 
       var stringNumber = Regex.Match(s.name, @"\d+").Value; 
       return string.IsNullOrEmpty(stringNumber) ? 0 : int.Parse(stringNumber); 
      }) 

코드를 처음에, 그래서 ThenBy 더 이상 영향을 미치지 아니합니다.

0
var test = new[] {"a 2", "a 10", "a"}; 

var sorted = test.OrderBy(s => new string(s.Where(char.IsLetter).ToArray())).ThenBy(s => 
{ 
    var stringNumber = Regex.Match(s, @"\d+").Value; 
    return string.IsNullOrEmpty(stringNumber) ? 0 : int.Parse(stringNumber); 
}); 

이것은 문자로 먼저 정렬 한 다음 숫자로 정렬해야합니다.

3

내가 명시 적으로 선정시를 추출하는 것이 좋습니다 : 정규 표현식에서 namenumber 그룹 :

var list = new List<string>() { 
    "a", 
    "a 4", 
    "b 1", 
    "a 2", 
    "a 11" 
    }; 

    var result = list 
    .Select(item => new { 
     value = item, 
     match = Regex.Match(item, @"^(?<name>.*?)\s*(?<number>[0-9]*)$"), 
     }) 
    .OrderBy(item => item.match.Groups["name"].Value) 
    .ThenBy(item => item.match.Groups["number"].Value.Length) 
    .ThenBy(item => item.match.Groups["number"].Value) 
    .Select(item => item.value); 

테스트 :

Console.WriteLine(string.Join(Environment.NewLine, result)); 

결과 :

a 
a 2 
a 4 
a 11 
b 1 
+0

새 튜플 유형을 여기서 사용할 수 있습니다. – Sweeper

1

당신은 그런 일을 시도 할 수 ;

 var list = new List<string>() 
     { 
      "a ", 
      "a 4", 
      "b 1", 
      "a 2" 
     }; 

     int value = 0; 

     list = list 
      .Select(x => new { 
      WholeString = x, 
      StringPart = x.Split(' ')[0], 
      IntPart = int.TryParse(x.Split(' ')[1], out value) ? value : 0 
      }) 
      .OrderBy(x => x.StringPart) 
      .ThenBy(x => x.IntPart) 
      .Select(x => x.WholeString) 
      .ToList();