2014-02-25 2 views
1

나는 다음과 같은 문자열 배열이 : 나는 그들에게 다음과 같은 규칙 "기호와 그들을 정렬 할문자열은 C#

"access" 
"Addition" 
"account" 
"base" 
"Brick" 
"zammer" 
"Zilon" 

먼저 와야한다 주어진 캐릭터
  • 대문자
      .
    1. 자본 및 소문자 자신의 그룹으로 분류되어야한다.

    따라서, outpu를 t는 다음과 같아야합니다.

    "Addition" 
    "access" 
    "account" 
    "Brick" 
    "base" 
    "Zilon" 
    "zammer" 
    

    사용하는 언어는 C# 및 .Net 4.0입니다.

  • 답변

    0

    은 트릭을 할 것입니다 OrderBy/ThenBy 호출이

    List<string> list = new List<string>(); 
    list.Add("access"); 
    list.Add("Addition"); 
    list.Add("account"); 
    list.Add("base") 
    list.Add("Brick") 
    list.Add("zammer") 
    list.Add("Zilon") 
    list = list.Where(r => char.IsLower(r[0])).OrderBy(r => r) 
         .Concat(list.Where(r => char.IsUpper(r[0])).OrderBy(r => r)).ToList(); 
    for (int i = 0; i < list.Count; i++) 
        Console.WriteLine(list[i]); 
    
    7

    적절한 설정과 같이하십시오. 소문자 첫 글자에 의해

    1. 주문은 모든 a의를 얻을 수 있습니다 A 최초, 먼저 각 문자의 대문자로 항목을 얻을 것 등 IsLower(firstCharacter)하여 다음
    2. b들과 B의,,.
    3. 다음 전체 문자열로. 솔루션 아래
    var sorted = source.OrderBy(s => char.ToLower(s[0])) 
            .ThenBy(s => char.IsLower(s[0])) 
            .ThenBy(s => s) 
            .ToList(); 
    
    +0

    으로 좋을 수 있습니다'소스를 .OrderBy (s => char.ToLower (s [0])). 다음으로 축소 (s => s)'. 그 일을하는 것 같습니다. 어쨌든 +1하십시오. –

    +0

    +1하지만 스트링의 중간에 마개가없는 경우에만 작동합니까? (부여 된, OP의 예에는 어떤 것도 없지만 명시된 요구 사항이이 가능성을 배제하지는 않습니다). – Baldrick

    +1

    @ Baldrick 예, 위/아래 규칙은 첫 번째 문자에만 적용된다고 가정했습니다. – MarcinJuraszek

    0

    하나 이상의 캡 작동합니다.

    static void Main(string[] args) 
        { 
    
         var names = new List<String>() { 
         "access", 
         "Addition", 
         "ADDition", 
         "ADdition", 
         "account", 
         "base", 
         "Brick", 
         "zammer", 
         "Zilon" 
         }; 
    
    
         names.Sort((one, two) => 
         { 
          int result = 0; 
    
          var oneArray = one.ToCharArray(); 
          var twoArray = two.ToCharArray(); 
    
          var minLength = Math.Min(oneArray.Length, twoArray.Length) - 1; 
          var i = 0; 
    
          while (i < minLength) 
          { 
           //Diff Letter 
           if (Char.ToUpper(one[i]) != Char.ToUpper(two[i])) 
           { 
            result = Char.ToUpper(one[i]) - Char.ToUpper(two[i]); 
            break; 
           } 
    
           // Same Letter, same case 
           if (oneArray[i] == twoArray[i]) 
           { 
            i++; 
            continue; 
           } 
           // Same Letter, diff case 
           result = one[i] - two[i]; 
           break; 
          } 
    
          return result; 
         }); 
    
         foreach (string s in names) 
          Console.WriteLine(s); 
    
         Console.WriteLine("done"); 
    
    0

    첫 번째 문자를 넘어 가고 싶은 경우에, 나는 비교 자 구현해야합니다 :

    class MyComparer : IComparer<string> 
    { 
        public int Compare(string x, string y) 
        { 
         if ((x == null) && (y == null)) 
         { 
          return 0; 
         } 
    
         if (x == null) 
         { 
          return 1; 
         } 
    
         if (y == null) 
         { 
          return -1; 
         } 
    
         var l = Math.Min(x.Length, y.Length); 
         for (var i = 0; i < l; i++) 
         { 
          var c = x[i]; 
          var d = y[i]; 
          if (c != d) 
          { 
           if (char.ToLowerInvariant(c) == char.ToLowerInvariant(d)) 
           { 
            return StringComparer.Ordinal.Compare(new string(c, 1), new string(d, 1)); 
           } 
           else 
           { 
            return StringComparer.OrdinalIgnoreCase.Compare(new string(c, 1), new string(d, 1)); 
           } 
          } 
         } 
    
         return x.Length == y.Length ? 0 : x.Length > y.Length ? 1 : -1; 
        } 
    } 
    

    을 그리고 그것을 사용

    var myComparer = new MyComparer(); 
    source.OrderBy(s => s, myComparer);