2016-09-19 8 views
0

問題: sortnameでソートするリストがあります。それはとてもうまくいく。しかし、私は開始時に特別な文字でソート名を持っています。シンボルが観察されないように私は何ができますか?シンボルとSORTNAMEのアルファベット順にリストをソートして特殊文字を無視する

例:

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

シンボルが削除されないことがあります。私のsortfunction(代替)商業銀行

+0

? –

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

全サンプルコードの2つだけの行が必要になります文字が始まり、A-Zまたは同様の番号で許可されている

 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

あなたが正しいです、私は記号と数字で苦労するようにコードを変更します –

関連する問題