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 函数时都调用。
有人知道如何解决这个问题或者是否有可能?
非常感谢。
您可以通过模式匹配来做到这一点:
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
可能不是最好的方法,并且完全拆分它们可能是一个坏主意!请参阅此处的其他优秀答案)。