我需要一个函数将一个字符串数组转换为一个字符串,该字符串可以按照与排序输入相同的顺序排序(排序第一个输入参数,如果等于排序第二个等...)
在本机代码中,用\ 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,因为我并不总是控制密钥的排序方式.此外,序数可能会在国际集上产生错误的排序顺序......
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)