C# 用c语言进行一行声明、比较和返回#

C# 用c语言进行一行声明、比较和返回#,c#,lambda,functional-programming,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)) ;

我想知道是否可以执行以下代码:

_ = 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)) ;
这一行是我想要避免的,但我也不想每次调用Split函数时都调用它

有人知道如何解决这个问题,或者这是可能的吗

非常感谢。

您可以通过以下方式完成此操作:

使用,您可以将其编写为:

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

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

没有逐字回答这个问题,因为canton7使用模式匹配的答案正是您想要的(使用模式匹配声明内联变量),但这看起来像你真正想要做的:

var name = "foo bar baz";
var i = name.LastIndexOf(' ');
var firstNames = i > -1 ? name.Substring(0, i) : name;
var lastName = i > -1 ? name.Substring(i + 1, name.Length - i - 1) : "";

var t = new Tuple<string, string>(firstNames, lastName);
var name=“foo bar baz”;
var i=name.LastIndexOf(“”);
var firstNames=i>-1?name.Substring(0,i):name;
var lastName=i>-1?name.Substring(i+1,name.Length-i-1):“”;
var t=新元组(firstname,lastName);
这实现了“最后一个空格后面的部分(如果存在)是姓氏”。请注意,对于许多姓氏来说,情况并非如此,因为姓氏可以与名字一样由多个部分组成


换句话说,你不能合理地分割“Jean-Marc De Palma”。

@canton7的答案很美,但这个算法对约翰·冯·诺依曼甚至你自己的名字都不起作用

var name = "Jesús Narváez Tamés";
var displayName = "TODO";


var fl = name.Split(' ') is var names && names.Count() > 1 
            ? (string.Join(" ", names.Take(names.Count() - 1)), names.Last())
            : (displayName, string.Empty);

Console.WriteLine($"First: {fl.Item1}");
Console.WriteLine($"Last: {fl.Item2}");

名字和名字都是多才多艺的。不要这样分开

真正的问题是为什么要编写不可读的代码。您认为这样做节省的任何执行时间都会浪费在以后阅读和修改此代码所需的时间上。另外,
displayName
是否应该是
name
?@CodeCaster这只是为了知道是否有办法或是否可能。无论如何,我不觉得它不可读。学习的方法就是尝试。太快了!:))非常感谢你,这正是我想要的,你给了我三个变体:)
。Trim()
removeMptyEntries
会让它更好:)(纯粹出于兴趣,如果你碰巧使用C#8,你也可以使用范围而不是
。子字符串
)@canton我读过这些,但还没有在实践中使用它们,所以我现在还不提倡它们。我老了吗?我不是建议你改变你的答案(因此括号)。C#正在以如此快的速度添加新语法,我想我们都开始觉得有点老了!谢谢@CodeCaster为您解答:)。这个看起来也不错。不要觉得自己老了,我很年轻,也需要跟上所有的快速变化@廷坦。多部分姓氏(姓氏词缀)在我出生的地方非常常见,“DeVries”和“de Vries”是两个不同的名字,它们的存储和排序方式不同。是的,你完全正确!这也是我的一个问题。例如,在西班牙语中,您的名字可以是“阿隆索·费尔南多”,姓氏也可以是“阿隆索”。或者你的名字可以是“费尔南多”,姓“阿隆索”。我真的不知道如何在代码上区分它们。
var result = s.Split(' ') is var names && names.Length > 1 ? 
    (string.Join(" ", names[0..^1]), names[^1]) :
    (displayName, string.Empty);
var name = "foo bar baz";
var i = name.LastIndexOf(' ');
var firstNames = i > -1 ? name.Substring(0, i) : name;
var lastName = i > -1 ? name.Substring(i + 1, name.Length - i - 1) : "";

var t = new Tuple<string, string>(firstNames, lastName);
var name = "Jesús Narváez Tamés";
var displayName = "TODO";


var fl = name.Split(' ') is var names && names.Count() > 1 
            ? (string.Join(" ", names.Take(names.Count() - 1)), names.Last())
            : (displayName, string.Empty);

Console.WriteLine($"First: {fl.Item1}");
Console.WriteLine($"Last: {fl.Item2}");
First: Jesús Narváez
Last: Tamés