2014-02-25 94 views
1

我有一個字符串類似如下的數組:字符串排序在C#

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

我想它們,將它們整理witht以下規則」

  1. 大寫字母給定的人物應該是第一位的。
  2. 的大寫和小寫字母應該在自己的組進行分類。

因此,outpu t應該是:

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

我使用的語言是C#和.Net 4.0。

回答

0

嘗試這樣

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

一套適當的OrderBy/ThenBy調用就可以了。

  1. 排序按小寫的第一個字母,讓所有a S和A第一個,然後b S和B S等
  2. 然後通過IsLower(firstCharacter),這將讓大寫的項目每個字母第一。
  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]))。ThenByDescending(s => s)'。這似乎是做這項工作。無論如何。 –

+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);