2016-09-19 62 views
0

我的問題: 我有一個列表,我想按sortname排序。這很好。但是我在開始的時候有特殊字符的排序。我該怎麼做才能看到符號?用符號sortname的按字母排序列表,但忽略特殊字符

實例:(二選一)商業銀行

我sortfunction:

cmembers.Sort(delegate (ChamberMembers x, ChamberMembers y) 
       { 
        if (x.companysortName == null && y.companysortName == null) return 0; 
        else if (x.companysortName == null) return -1; 
        else if (y.companysortName == null) return 1; 
        else return x.companysortName.CompareTo(y.companysortName); 
       }); 

的符號不能刪除!

+0

哪些字符被允許在年初A-Z或數字呢? –

+1

使用[CompareOptions](https://msdn.microsoft.com/en-us/library/system.globalization.compareoptions(v = vs.110).aspx)(在你的情況下'IgnoreSymbols')應該做的伎倆。 – Filburt

+0

只以A-Z或a-z無數字和特殊字符開頭 – Andreas

回答

1

使用正則表達式和LINQ訂購。您將只需要兩行代碼

 Regex reg = new Regex(@"[^a-zA-Z]"); 
     var result = input.OrderBy(x => reg.Replace(x, string.Empty)).ToArray(); 

的代碼全部樣本

 var input = new List<string>(); 
     input.Add("(c"); 
     input.Add("*b"); 
     input.Add("_a"); 
     Regex reg = new Regex(@"[^a-zA-Z]"); 
     var result = input.OrderBy(x => reg.Replace(x, string.Empty)).ToArray(); 
+0

它並未被刪除。你可以試試我的代碼 –

+0

我喜歡這個想法。但我有一個對象不是一個刺痛。你有什麼想法來解決這個對象?我的意思是我在這個對象中有幾個字符串,我將通過這個排序名排序對象 – Andreas

+0

你能給我你的對象的結構嗎? –

1

只是比較前清理它。

cmembers.Sort(delegate (ChamberMembers x, ChamberMembers y) 
       { 
        if (x.companysortName == null && y.companysortName == null) return 0; 
        else if (x.companysortName == null) return -1; 
        else if (y.companysortName == null) return 1; 
        else return FilterSpecialChars(x.companysortName).CompareTo(FilterSpecialChars(y.companysortName)); 
       }); 

public static string FilterSpecialChars(string str) 
{ 
    return ...; 
} 
1

如果我明白你的問題,這是一個例子:

static void Main(string[] args) 
    { 
     List<ChamberMembers> lst = new List<ChamberMembers>(); 

     lst.Add(new ChamberMembers 
     { 
      companysortName = "b" 
     }); 

     lst.Add(new ChamberMembers 
     { 
      companysortName = "z" 
     }); 

     lst.Add(new ChamberMembers 
     { 
      companysortName = "e" 
     }); 

     lst.Add(new ChamberMembers 
     { 
      companysortName = "a" 
     }); 
     Console.WriteLine("\nBefore sort:"); 
     foreach (ChamberMembers ChamberMember in lst) 
     { 
      Console.WriteLine(ChamberMember.companysortName); 
     } 
     lst.Sort(); 
     Console.WriteLine("\nAfter sort:"); 
     foreach (ChamberMembers ChamberMember in lst) 
     { 
      Console.WriteLine(ChamberMember.companysortName); 
     } 

     Console.ReadLine(); 

    } 


} 

public class ChamberMembers : IComparable<ChamberMembers> 
{ 
    public string companysortName { get; set; } 


    public int CompareTo(ChamberMembers Chamber) 
    { 
     if (Chamber == null) 
      return 1; 
     else 
       return string.Compare(this.companysortName, Chamber.companysortName, CultureInfo.InvariantCulture, CompareOptions.IgnoreSymbols); 
    } 
} 
+1

儘管您正在執行'IComparable',但您的示例缺少OP正在努力的符號/數字。 – Filburt

+0

你是對的,我改變了代碼,所以它可以用符號和數字掙扎 –