簡體   English   中英

C# - 如何使用最后一個字符對字符串列表進行排序,忽略特殊字符(如果有的話)

[英]C# - How to sort a list of strings using last character by ignoring special character if any at the end

下面是我試圖實現並能夠對其進行排序的邏輯,但需要弄清楚忽略其中的特殊字符

我的邏輯:

  • 列表中的反轉字符串
  • 按升序排序
  • 再次反轉排序后的字符串&
  • 最后通過加入〜分隔符作為字符串返回。

      List<String> inputLst= new List<String>() { "Bananas!", "Cherry2", "Mango","Apples", "Grape$", "Guava" }; List<String> sortList = new List<String>(); List<String> outputList = new List<String>(); foreach (String str in inputLst) { sortList.Add(new String(str.ToCharArray().Reverse().ToArray())); } sortList.Sort(); foreach (String str in sortList) { outputList.Add(new String(str.ToCharArray().Reverse().ToArray())); } Return String.Join("~", outputList); 

我得到的輸出是Bananas!~Grape$~Cherry2~Guava~Mango~Apples

預計產量應該是Guava~Grape$~Mango~Bananas!~Apples~Cherry2

任何人都可以建議我優化解決方案,通過忽略特殊字符按最后一個字符排序列表? 在這里我使用了2個字符串反轉列表,它能以更有效的方式完成嗎? 注意:不使用LINQ請。

有了一點LINQ和Regex,這可以相對簡單地實現:

var inputList = new List<string>() { "Bananas!", "Cherry2", "Mango","Apples", "Grape$", "Guava" };

var outputList = inputList.OrderBy(s => new string(Regex.Replace(s, "[^a-zA-Z]", "")
                                                        .Reverse()
                                                        .ToArray()))
                          .ToList();

var output = String.Join("~", outputList);

編輯:非LINQ方法:

var inputList = new List<string>() { "Bananas!", "Cherry2", "Mango", "Apples", "Grape$", "Guava" };

inputList.Sort(new ReverseStringComparer());

var output = String.Join("~", inputList);

ReverseStringComparer:

class ReverseStringComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        string a = new string(Regex.Replace(x, "[^a-zA-Z]", "").Reverse().ToArray());
        string b = new string(Regex.Replace(y, "[^a-zA-Z]", "").Reverse().ToArray());
        return a.CompareTo(b);
    }
}

解決方案沒有正則表達式:

string foo()
{
    List<String> inputLst= new List<String>() { "Bananas!", "Cherry2", "Mango","Apples", "Grape$", "Guava" };

    inputLst.Sort((l, r) => new string(l.Reverse().SkipWhile( x => !char.IsLetter(x) ).ToArray()).CompareTo( new string(r.Reverse().SkipWhile(x => !char.IsLetter(x)).ToArray()) ) );

    return String.Join("~", inputLst);
}

要按照注釋中的建議跳過所有非字母字符(而不僅僅是字符串的開頭),只需使用Where而不是SkipWhile如下所示:

string bar()
{
    List<String> inputLst= new List<String>() { "Bananas!", "Cherry2", "Mango","Apples", "Grape$", "Guava" };

    inputLst.Sort((l, r) => new string(l.Reverse().Where( x => char.IsLetter(x) ).ToArray()).CompareTo( new string(r.Reverse().Where(x => char.IsLetter(x)).ToArray()) ) );

    return String.Join("~", inputLst);
}

請注意, Where有INVERS邏輯( char.IsLetter(x)比較SkipWhile!char.IsLetter(x)

找到最后一個符號作為字母並按其排序。

var inputList = new List<string>() {
    "Bananas!", "Cherry2", "Mango","Apples", "Grape$", "Guava" };

var outputList = inputList.OrderBy(s => s.Last(c => char.IsLetter(c)));

Console.WriteLine(string.Join("~", outputList));

不需要反向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM