从.Net中的多个字符串创建可排序字符串

Ser*_*hov 0 .net c# string

我需要一个函数将一个字符串数组转换为一个字符串,该字符串可以按照与排序输入相同的顺序排序(排序第一个输入参数,如果等于排序第二个等...)

在本机代码中,用\ 0分隔字符串会有所作为,但不知何故

("a"+ char.MinValue +"2").CompareTo("a1")等于1!

发生了什么,是否可以创建这样的功能?

public static string StringsToKey(params string[] values)
Run Code Online (Sandbox Code Playgroud)

编辑:这是我想要成功的测试:

Assert.IsTrue(MiscUtils.StringsToKey("a", "2").CompareTo(MiscUtils.StringsToKey("a1")) < 0);

我想避免使用CompareOrdinal,因为我并不总是控制密钥的排序方式.此外,序数可能会在国际集上产生错误的排序顺序......

Ale*_*lex 5

public static string StringsToKey(params string[] values)
{
    return string.Join(char.MinValue.ToString(), values);
}
Run Code Online (Sandbox Code Playgroud)

用法应该有效:

var s1 = StringsToKey("abc", "def", "1234");
var s2 = StringsToKey("ab", "cde", "f1234");

var comparisonResult = string.Compare(s1, s2, StringComparison.Ordinal);
Run Code Online (Sandbox Code Playgroud)

编辑:

var s1 = StringsToKey("a", "2");
var s2 = StringsToKey("a1");

var r = string.Compare(s1, s2, StringComparison.Ordinal);
Run Code Online (Sandbox Code Playgroud)

返回负值(-49).

编辑二:

正如Joe在评论中提到的,如果字符串包含'\0'(或者'\t'如果tab用作分隔符),这将不起作用.因此,没有这样的分隔符适用于所有情况.所以,我重写了这个函数,但现在它有2个参数,但仍然使用CompareTo方法进行比较:

public static int CompareStringSequences(
    IEnumerable<string> first, 
    IEnumerable<string> second)
{
    var x = Enumerable.Zip(first, second, (s1, s2) => s1.CompareTo(s2))
        .FirstOrDefault(i => i != 0);

    return x == 0 ?
               x1.Length - x2.Length :
               x;
}
Run Code Online (Sandbox Code Playgroud)