我需要一个函数,它可以将字符串数组转换为可排序的字符串,就像对输入进行排序一样(首先对输入参数进行排序,如果相等,则对第二个参数进行排序,等等)
在本机代码中,可以使用\0分隔字符串,但不知何故
("a“+ char.MinValue + "2").CompareTo("a1")等于1!
这是怎么回事,有没有可能创建这样一个函数?
public static string StringsToKey(params string[] values)编辑:这是我想要成功的测试:
Assert.IsTrue(MiscUtils.StringsToKey("a", "2").CompareTo(MiscUtils.StringsToKey("a1")) < 0);
我希望避免使用CompareOrdinal,因为我并不总是能够控制键的排序方式。此外,序数可能会在国际集合上产生不正确的排序顺序...
发布于 2011-02-11 15:16:34
与以null结尾的C样式字符串不同,.NET字符串可以包含null字符,因此在一般情况下,没有分隔符可以保证排序低于字符串中的任何有效字符。
当然,如果您确定您的字符串不包含空值,并且序号排序是可以的,那么已经发布的一些解决方案将会起作用。
但我要说的是,甚至不要尝试它。为字符串数组编写比较器将更有效(避免创建临时字符串),并更好地表达您的意图。有很多方法可以做到这一点,包括以下方法(比较IList而不是string[]以获得更大的灵活性,并支持区分区域性的比较):
public class StringListComparer : IComparer<IList<string>>
{
private StringComparer comparer;
public StringListComparer()
: this(StringComparer.Ordinal)
{
}
public StringListComparer(StringComparer comparer)
{
if (comparer == null) throw new ArgumentNullException("comparer");
this.comparer = comparer;
}
public int Compare(IList<string> x, IList<string> y)
{
int result;
for (int i = 0; i < Math.Min(x.Count, y.Count); i++)
{
result = comparer.Compare(x[i], y[i]);
if (result != 0) return result;
}
return x.Count.CompareTo(y.Count);
}
}上面的代码是未经测试的,可能有but,但我相信你已经明白了。
发布于 2011-02-11 06:44:39
public static string StringsToKey(params string[] values)
{
return string.Join(char.MinValue.ToString(), values);
}用法应该是可行的:
var s1 = StringsToKey("abc", "def", "1234");
var s2 = StringsToKey("ab", "cde", "f1234");
var comparisonResult = string.Compare(s1, s2, StringComparison.Ordinal);编辑:
var s1 = StringsToKey("a", "2");
var s2 = StringsToKey("a1");
var r = string.Compare(s1, s2, StringComparison.Ordinal);返回负值(-49)。
编辑II:
正如Joe在评论中提到的,如果字符串包含'\0' (如果使用制表符作为分隔符,则为'\t' ),则此操作将不起作用。因此,没有这样一个在所有情况下都有效的分隔符。所以,我重写了函数,但现在它有两个参数,但仍然使用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;
}发布于 2011-02-11 06:29:27
String.CompareTo()方法返回一个整数,将这两个值与最短字符串的长度进行比较。给定'\0‘是’小于‘字符'1’,它以正常的字符串顺序跟在它后面。您可以使用String.Split()方法拆分任何字符。包括'\0‘。然后可以使用Array.Sort()方法对字符串进行排序。
https://stackoverflow.com/questions/4963423
复制相似问题