C# - name separation & last name in upper to Camel
Well, I don't know if your code could be better or faster but the code could be a lot shorter by using some Linq-&quot;magic&quot;.
Your code could use some level of input-parameter-validation because the methods in question are public which means anybody who uses these methods can pass whatever he/she wants, even null which would blow each method and would expose implementation details.
I don't know if the requirement is meant to be that passing Ronald Chris MAC DONALDS returns as lastname MacDonalds but for me this doesn't sound correct.
Instead of splitting the fullname twice and then splitting the lastname again, you should consider to just pass a string[] to the methods.
You could consider to have one public method where you pass the fullname and get a Tuple&lt;string, string&gt; so you would need only one parameter validation because you can make the other methods private.
Because a lastname contains only UpperCase letters we can take the passed string[] and take each string in this array which contains only upper-case letters, we will leave the first char because it allready is uppercase and take the remaining chars as lower-case chars. Last we join them using a space char like so
private static string GetLastName(string[] nameParts)
{
    return string.Join(&quot; &quot;, nameParts.Where(s =&gt; s.All(c =&gt; char.IsUpper(c)))
                                     .Select(s =&gt; s[0] + s.Substring(1).ToLowerInvariant()));
}  

For the firstname we know that not all chars are upper-case chars. So we take each string inside the passed array and check if any char is a lower-case char, and then join the found strings by using a space char like so
private static string GetFirstName(string[] nameParts)
{
    return string.Join(&quot; &quot;, nameParts.Where(s =&gt; s.Any(c =&gt; char.IsLower(c))));
}  

Last but not least we need to call these 2 methods after some proper validation like so
public static Tuple&lt;string, string&gt; GetNormalizedNames(string fullName)
{
    if (fullName == null) { throw new ArgumentNullException(nameof(fullName)); }
    if (string.IsNullOrWhiteSpace(fullName)) { return Tuple.Create(&quot;&quot;, &quot;&quot;); }

    var nameParts = fullName.Split(' ');

    return Tuple.Create(GetFirstName(nameParts), GetLastName(nameParts));
}  

which we then call like so
var firstNameLastNameTuple = GetNormalizedNames(fullName);
Console.WriteLine(&quot;Name: &quot; + firstNameLastNameTuple.Item1);
Console.WriteLine(&quot;Last name: &quot; + firstNameLastNameTuple.Item2);  

The whole code is now easier to read and therefor easier to maintain. Sure linq is only syntactic sugar and won't be faster than iterating over the chars by &quot;hand&quot; but the benefit is less and easier to read code.