Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在大写字母之间创建空格,并跳过连续字符之间的空格_C#_Linq - Fatal编程技术网

C# 在大写字母之间创建空格,并跳过连续字符之间的空格

C# 在大写字母之间创建空格,并跳过连续字符之间的空格,c#,linq,C#,Linq,我得到了创造空间的方法“ThisCourse”就是“ThisCourse” 但我不能 在“ThisCourseID”和“ThisCourseID”之间创建空格,使其成为“This Course ID”,而在“ID”和“This Course ID”之间不留空格 在Linq中是否有这样做的方法???var s=“ThisCourseID”; var s = "ThisCourseID"; for (var i = 1; i < s.Length; i++) { if (char.

我得到了创造空间的方法“ThisCourse”就是“ThisCourse”

但我不能

在“ThisCourseID”和“ThisCourseID”之间创建空格,使其成为“This Course ID”,而在“ID”和“This Course ID”之间不留空格

在Linq中是否有这样做的方法???

var s=“ThisCourseID”;
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"
对于(变量i=1;i
如果您打算在很长的字符串上使用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
var s=“ThisCourseIDSomething”;
对于(变量i=1;i
您不需要LINQ-但您可以“枚举”并使用lambda使其更通用…
(但不确定这些是否有意义)


:)

如果必须是单个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);
var s=“ThisCourseIDMoreyAhy”;
s=string.Join(
字符串。空,
s、 选择((x,i)=>(
字符IsUpper(x)和&i>0和&

(char.IsLower(s[i-1])| |(我也知道你为什么需要LINQ?谢谢你的帮助,Yorye先生,请问,有没有解决办法让LINQ+1正确处理给定的示例。注意,这对“ThisCourseIDMoreWords”这样的东西不起作用。本例中的输出是“this CourseIDmoreWords”@Robbie你是对的,但要使它工作起来就不难了。解决了它。@HadyShaltout可以用LINQ实现同样的逻辑,但这是个坏主意,因为LINQ不是一个适合你需要的工具。@YoryeNathan我想再次+1你,但我不能:)
    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);
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);