创造大写字母之间的空间与连续的跨越空间

时间:2012-04-01 12:42:48

标签: c# linq

我得到了创造空间“ThisCourse”的方式“本课程”

Add Space Before Capital Letter By (EtienneT) LINQ Statement

但我不能

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

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

3 个答案:

答案 0 :(得分:8)

好吧,如果它必须是一个单一的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);

输出:“此课程ID更多X是啊”

答案 1 :(得分:4)

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来改进它,但是出于您的目的,正如您所呈现的那样,它应该可以正常工作。

<强> FIX:

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

答案 2 :(得分:0)

你不需要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);

:)