C# 中的一行声明、比较和返回

Mr.*_*eer 0 c# lambda functional-programming

我想知道是否可以执行类似以下代码的操作:

_ = name.Split(' ') => names.Count() > 1 ?
                new Tuple<string, string>(string.Join(" ", names.Take(names.Count() - 1)), names.Last()) :
                new Tuple<string, string>(name, string.Empty)) ;
Run Code Online (Sandbox Code Playgroud)

names的结果在哪里name.Split(' ')

我不知道如何访问这个结果而不在单独的行中声明它,例如:

var names = name.Split(' ');
Run Code Online (Sandbox Code Playgroud)

这行是我想避免的,但我也不想每次调用 Split 函数时都调用。

有人知道如何解决这个问题或者是否有可能?

非常感谢。

can*_*on7 5

您可以通过模式匹配来做到这一点:

var result = s.Split(' ') is var names && names.Length > 1 ? 
    new Tuple<string, string>(string.Join(" ", names.Take(names.Length - 1)), names.Last()) :
    new Tuple<string, string>(displayName, string.Empty);
Run Code Online (Sandbox Code Playgroud)

var模式是任何类型或值的包罗万象。

(我将您的调用转为.Count()into .Length,因为它对于数组来说更惯用)。

我建议使用ValueTuple而不是Tuple<T>

var result = s.Split(' ') is var names && names.Length > 1 ? 
    (string.Join(" ", names.Take(names.Length - 1)), names.Last()) :
    (displayName, string.Empty);
Run Code Online (Sandbox Code Playgroud)

使用C# 8 的 range,您可以将其写为:

var result = s.Split(' ') is var names && names.Length > 1 ? 
    (string.Join(" ", names[0..^1]), names[^1]) :
    (displayName, string.Empty);
Run Code Online (Sandbox Code Playgroud)

(请注意,使用拆分名称string.Split可能不是最好的方法,并且完全拆分它们可能是一个坏主意!请参阅此处的其他优秀答案)。