C#如何单行处理Split结果:避免单独声明变量与重复调用Split
解决方案:避免重复Split且不单独声明变量的写法
当然可行!你可以通过几种方式在单次调用Split的同时,在表达式内暂存结果,不用单独声明变量。下面是几个简洁的实现方案:
方案1:使用C# 8+的Switch表达式(推荐)
这是最现代、可读性最好的写法,利用switch表达式的模式匹配特性,一次性捕获Split的结果并进行判断:
var result = name.Split(' ') switch { var names when names.Length > 1 => Tuple.Create(string.Join(" ", names[0..^1]), names[^1]), _ => Tuple.Create(name, string.Empty) };
说明:
- 先执行一次
name.Split(' '),把结果传入switch表达式 - 通过
var names when names.Length > 1捕获Split的结果,同时判断数组长度是否大于1 names[0..^1]是C# 8引入的范围运算符,效果和names.Take(names.Length - 1)完全一致,但写法更简洁直观- 如果数组长度不大于1,就返回原name和空字符串组成的Tuple
方案2:LINQ查询表达式中的Let子句
如果你使用的是较旧的C#版本(低于8),可以借助LINQ的查询表达式,通过let关键字暂存Split的结果:
var result = (from splitResult in new[] { name.Split(' ') } let names = splitResult select names.Length > 1 ? Tuple.Create(string.Join(" ", names.Take(names.Length - 1)), names.Last()) : Tuple.Create(name, string.Empty)).First();
说明:
- 我们把Split的结果包装到一个临时数组中,然后在查询里用
let names = splitResult把它暂存起来 - 最后调用
.First()取出唯一的结果,整个逻辑在一个表达式内完成,全程只调用一次Split
额外优化:用ValueTuple替代传统Tuple
从C# 7开始,官方更推荐使用ValueTuple(值元组),它比传统的Tuple更轻量,写法也更简洁灵活:
// Switch表达式版本的ValueTuple写法 var result = name.Split(' ') switch { var names when names.Length > 1 => (string.Join(" ", names[0..^1]), names[^1]), _ => (name, string.Empty) };
使用时还可以直接解构元组,进一步提升代码可读性:
var (fullFirstName, lastName) = result;
内容的提问来源于stack exchange,提问作者Mr.Deer




