大小写敏感的排序,大写字母排在最后。

7

我希望对一个List<string>进行排序,区分大小写,并且将大写字母排在后面,即按照以下顺序排序:

a,aBC,b,bXY,c,A,Ax,B,C,...

我已经尝试过以下方法:

Comparison<string> c = (string x1,string x2) => StringComparer.Ordinal.Compare(x1,x2);
list.Sort(c);

但它返回

A、Ax、B、C、a、aBC、b、bXY、c...

是否有预定义的方法来做这件事,还是我需要自己琢磨一些东西?

编辑:由于“大写字母最后”似乎已经足够困难,因此我暂时忽略了数字。


5
肮脏的黑客技巧:1)将小写字母替换为大写字母,反之亦然。2)像您做的那样排序。3)再次执行步骤1。 - JohnTortugo
@JohnTortugo:不管它是否有瑕疵,那真是个好主意! - oliver
@JohnTortugo 哈哈,那是个好主意(点赞) - Agent_Orange
3个回答

2

最终我选择了@JohnTortugo的建议。感谢John,这个想法非常简单,短小易行!

  1. Swap upper and lower case in a string by XOR'ing 0x20 with each byte (ASCII coding assumed):

    static string swapUpperLower(string s)
    {
        return System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(s).Select(c => (byte)(c^0x20)).ToArray());
    }
    
  2. Swap case for every string in the list before and after sorting

        Comparison<string> c = (string x1,string x2) => StringComparer.Ordinal.Compare(x1,x2);
    
        sl = sl.Select(s => swapUpperLower(s)).ToList();
        sl.Sort(c);
        sl = sl.Select(s => swapUpperLower(s)).ToList();
    

Result:

a aBC b bXY c A Ax B C


是的,这真的很简单,我也在做这个 :v - Agent_Orange

0

试试这个:

byte[] ascii = Encoding.ASCII.GetBytes("aBcDEf");
        var result = ascii.OrderByDescending(b => b).ToList();
        string converted = string.Empty;
        foreach(var c in result)
        {
            converted += Char.ConvertFromUtf32(c);
        }
        Console.WriteLine(converted);

enter image description here


那也是首字母大写,这不是我想要的。我想要最后是大写字母,就像标题所说的那样。 - oliver
它仍然只设计用于单个字符,而不是字符串列表。 - oliver
创建一个字符串数组并使用相同的 foreach 循环。非常简单。 - rahulaga-msft
你能解释一下吗?嗯,好的,不行... - rahulaga-msft
对字符串进行排序与对字符串中的字符进行排序完全不同。 - oliver

0

你可以尝试这个冗长的代码,它可以完美地运行。

public static List<String> CustomSort(List<String> ls)
    {

        ls.Sort();
        List<String> Oint = new List<String>();
        List<String> Ocap = new List<String>();
        List<String> Osma = new List<String>();

        foreach(string s in ls)
        {
            int n;
            bool isNumeric = int.TryParse(s, out n);
            if(isNumeric)
            {
                Oint.Add(s);
            }
            else if (char.IsUpper(s[0]))
            {
                Ocap.Add(s);
            }
            else if (!char.IsUpper(s[0]))
            {
                Osma.Add(s);
            }
        }

        var r1 = Oint.Concat(Osma).Concat(Ocap);

        List<String> com = r1.ToList();
        return com;

    }

然后像这样调用它

List<String> ls = new List<String>();
            ls.Add("1");
            ls.Add("Cdsd");
            ls.Add("BCCd");
            ls.Add("ADDD");
            ls.Add("3");
            ls.Add("2");
            ls.Add("aDFD");
            ls.Add("cSS");
            ls.Add("b");
        List<String> cuz = CustomSort(ls);
        foreach(String s in cuz)
        {
            Console.WriteLine(s);
        }

你可以尝试这段代码在这里

它必须能够工作,如果你将Aaaaa与aaaAA进行比较,那么aaAaa将排在第一位。 - Agent_Orange
在 aaAaa 和 aaa12 中,你想先出现哪一个? - Agent_Orange
我刚试了所有类型的字符串,我验证了aaa12会排在第一位。 - Agent_Orange
不,这不是意外! - Agent_Orange
哦,兄弟,我好像找到了一个漏洞,你能告诉我A和Aaaa哪个应该先出现吗? - Agent_Orange
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接