【问题标题】:Create Space Between Capital Letters and Skip Space Between Consecutive在大写字母之间创建空格并在连续之间跳过空格
【发布时间】:2012-04-01 12:42:48
【问题描述】:

我得到了将空间“ThisCourse”创建为“This Course”的方法

Add Space Before Capital Letter By (EtienneT) LINQ Statement

但我不能

在此“ThisCourseID”之​​间创建空间为“此课程ID”,“ID”之间没有空格

有没有办法在 Linq 中做到这一点??

【问题讨论】:

标签: c# linq


【解决方案1】:

好吧,如果它必须是单个 linq 语句...

var s = "ThisCourseIDMoreXYeahY";
s = string.Join(
        string.Empty, 
        s.Select((x,i) => (
             char.IsUpper(x) && i>0 && 
             ( char.IsLower(s[i-1]) || (i<s.Count()-1 && char.IsLower(s[i+1])) )
        ) ? " " + x : x.ToString()));
Console.WriteLine(s);

输出:“This Course ID More X Yes Y”

【讨论】:

    【解决方案2】:
    var s = "ThisCourseID";
    
    for (var i = 1; i < s.Length; i++)
    {
        if (char.IsLower(s[i - 1]) && char.IsUpper(s[i]))
        {
            s = s.Insert(i, " ");
        }
    }
    
    Console.WriteLine(s); // "This Course ID"
    

    如果你打算在很长的字符串上使用它,你可以使用 StringBuilder 来改进它,但是为了你的目的,正如你所介绍的那样,它应该可以正常工作。

    修复:

    var s = "ThisCourseIDSomething";
    
    for (var i = 1; i < s.Length - 1; i++)
    {
        if (char.IsLower(s[i - 1]) && char.IsUpper(s[i]) ||
            s[i - 1] != ' ' && char.IsUpper(s[i]) && char.IsLower(s[i + 1]))
        {
            s = s.Insert(i, " ");
        }
    }
    
    Console.WriteLine(s); // This Course ID Something
    

    【讨论】:

    • 感谢您的帮助 Yorye 先生,请问有没有使用 LINQ 的解决方案??
    • +1 用于正确处理给定的样本。请注意,这不适用于“ThisCourseIDMoreWords”之类的内容。在这种情况下,输出将是“This Course IDMore Words”
    • @Robbie 你是对的,但不应该很难玩弄条件以使其工作。修好了。
    • @HadyShaltout 可以使用 LINQ 实现相同的逻辑,但这是一个坏主意,因为在这种情况下 LINQ 不是适合您需求的工具。
    • @YoryeNathan 我会再次 +1 你,但我不能:)
    【解决方案3】:

    您不需要 LINQ - 但您可以“枚举”并使用 lambda 使其更通用...
    (虽然不确定这是否有意义)

    static IEnumerable<string> Split(this string text, Func<char?, char?, char, int?> shouldSplit)
    {
        StringBuilder output = new StringBuilder();
        char? before = null;
        char? before2nd = null;
        foreach (var c in text)
        {
            var where = shouldSplit(before2nd, before, c);
            if (where != null)
            {
                var str = output.ToString();
                switch(where)
                {
                    case -1:
                        output.Remove(0, str.Length -1);
                        yield return str.Substring(0, str.Length - 1);
                        break;
                    case 0: default:
                        output.Clear();
                        yield return str;
                        break;
                }
            }
            output.Append(c);
            before2nd = before;
            before = c;
        }
        yield return output.ToString();
    }
    

    ...并像这样称呼它,例如...

        static IEnumerable<string> SplitLines(this string text)
        {
            return text.Split((before2nd, before, now) =>
            {
                if ((before2nd ?? 'A') == '\r' && (before ?? 'A') == '\n') return 0; // split on 'now'
                return null; // don't split
            });
        }
        static IEnumerable<string> SplitOnCase(this string text)
        {
            return text.Split((before2nd, before, now) =>
            {
                if (char.IsLower(before ?? 'A') && char.IsUpper(now)) return 0; // split on 'now'
                if (char.IsUpper(before2nd ?? 'a') && char.IsUpper(before ?? 'a') && char.IsLower(now)) return -1; // split one char before
                return null; // don't split
            });
        }
    

    ...在某个地方...

            var text = "ToSplitOrNotToSplitTHEQuestionIsNow";
            var words = text.SplitOnCase();
            foreach (var word in words)
                Console.WriteLine(word);
    
            text = "To\r\nSplit\r\nOr\r\nNot\r\nTo\r\nSplit\r\nTHE\r\nQuestion\r\nIs\r\nNow";
            words = text.SplitLines();
            foreach (var word in words)
                Console.WriteLine(word);
    

    :)

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 2019-10-14
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 2015-04-28
      • 1970-01-01
      相关资源
      最近更新 更多