如何在C#中使用Linq对包含特殊字符的字母数字字符串进行排序?

6mzjoqzu  于 2022-12-06  发布在  C#
关注(0)|答案(2)|浏览(192)

如何在C#中使用Linq对包含特殊字符的字母数字字符串进行排序?排序顺序应该是先包含特殊字符,然后是数字,最后是字母。
示例:
输入- {您好,#测试,@红色,白色,123@Test,@123Test,%54Sun,Dom,左侧}
预期- {@123测试,%54太阳,@红色,#测试,白色,123测试,多姆,你好,左边}
enter image description here

tgabmvqs

tgabmvqs1#

由于标准字符串比较就是这样做的,因此可以使用OrderBy

var input = new[] { "Hello", "#Test", "@Red", "&While", "123@Test", "@123Test", "%54Sun", "Dom", "Left" };
foreach (var s in input.OrderBy(x => x)) Console.WriteLine(s);

提供:

@123Test
@Red
&While
#Test
%54Sun
123@Test
Dom
Hello
Left

由于字符串比较与区域性相关,因此根据当前区域性得不同,此比较可能会有所不同.如果希望它与区域性无关,请使用例如OrderBy(x => x, StringComparer.InvariantCulture) .

lyr7nygr

lyr7nygr2#

您可以使用IComparer的自定义实现,然后将其传递给OrderBy调用。例如:

public class SpecialCharactersNumbersLettersComparer : IComparer<string>
{
    private readonly IComparer<string> defaultComparer = StringComparer.InvariantCulture;
    
    private static int OrderOfChar(char ch)
    {
        if(Char.IsLetter(ch))
            return 2;
        if(Char.IsDigit(ch))
            return 1;
        return 0;
    }
    
    public int Compare(string left, string right)
    {
        if(string.IsNullOrEmpty(left)
          || string.IsNullOrEmpty(right)) {
            return defaultComparer.Compare(left, right);
        }
        
        var leftChar = left[0];
        var rightChar = right[0];
        var leftOrder = OrderOfChar(leftChar);
        var rightOrder = OrderOfChar(rightChar);
        
        if(leftOrder == rightOrder)
            return defaultComparer.Compare(left, right);
        
        if(leftOrder > rightOrder)
            return 1;
        return -1;
    }
}

public static List<string> SortSpecialCharactersNumbersAlphabet(IEnumerable<string> input)
{
    return input.OrderBy(_ => _, new SpecialCharactersNumbersLettersComparer())
        .ToList();
}

用作:

Console.WriteLine(string.Join(", ",
    SortSpecialCharactersNumbersAlphabet(new [] {
    "Hello", "#Test", "@Red", "&While", "123@Test", "@123Test", "%54Sun", "Dom", "Left"})));

产生输出:

@123Test, @Red, &While, #Test, %54Sun, 123@Test, Dom, Hello, Left

相关问题