首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在.Net中从多个字符串创建可排序字符串

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

Stack Overflow用户
提问于 2011-02-11 06:22:11
回答 5查看 251关注 0票数 0

我需要一个函数,它可以将字符串数组转换为可排序的字符串,就像对输入进行排序一样(首先对输入参数进行排序,如果相等,则对第二个参数进行排序,等等)

在本机代码中,可以使用\0分隔字符串,但不知何故

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

这是怎么回事,有没有可能创建这样一个函数?

代码语言:javascript
复制
public static string StringsToKey(params string[] values)

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

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

我希望避免使用CompareOrdinal,因为我并不总是能够控制键的排序方式。此外,序数可能会在国际集合上产生不正确的排序顺序...

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-11 15:16:34

与以null结尾的C样式字符串不同,.NET字符串可以包含null字符,因此在一般情况下,没有分隔符可以保证排序低于字符串中的任何有效字符。

当然,如果您确定您的字符串不包含空值,并且序号排序是可以的,那么已经发布的一些解决方案将会起作用。

但我要说的是,甚至不要尝试它。为字符串数组编写比较器将更有效(避免创建临时字符串),并更好地表达您的意图。有很多方法可以做到这一点,包括以下方法(比较IList而不是string[]以获得更大的灵活性,并支持区分区域性的比较):

代码语言:javascript
复制
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,但我相信你已经明白了。

票数 1
EN

Stack Overflow用户

发布于 2011-02-11 06:44:39

代码语言:javascript
复制
public static string StringsToKey(params string[] values)
{
    return string.Join(char.MinValue.ToString(), values);
}

用法应该是可行的:

代码语言:javascript
复制
var s1 = StringsToKey("abc", "def", "1234");
var s2 = StringsToKey("ab", "cde", "f1234");

var comparisonResult = string.Compare(s1, s2, StringComparison.Ordinal);

编辑:

代码语言:javascript
复制
var s1 = StringsToKey("a", "2");
var s2 = StringsToKey("a1");

var r = string.Compare(s1, s2, StringComparison.Ordinal);

返回负值(-49)。

编辑II:

正如Joe在评论中提到的,如果字符串包含'\0' (如果使用制表符作为分隔符,则为'\t' ),则此操作将不起作用。因此,没有这样一个在所有情况下都有效的分隔符。所以,我重写了函数,但现在它有两个参数,但仍然使用CompareTo方法进行比较:

代码语言:javascript
复制
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;
}
票数 5
EN

Stack Overflow用户

发布于 2011-02-11 06:29:27

String.CompareTo()方法返回一个整数,将这两个值与最短字符串的长度进行比较。给定'\0‘是’小于‘字符'1’,它以正常的字符串顺序跟在它后面。您可以使用String.Split()方法拆分任何字符。包括'\0‘。然后可以使用Array.Sort()方法对字符串进行排序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4963423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档