Linq 当您同时使用Split和FirstOrDefault方法时,空检查的最有效方法或最佳实践是什么?
我同时使用Split和LastOrDefault方法,我使用这个代码块进行空检查。但对我来说,这似乎不是最有效的方法。因为我使用了很多check和&&运算符。看起来有点难看。有没有更好的方法来完成这个空检查?(我在网上搜索,但找不到相关答案。) 注:C语言版本4.0 这是我的密码:Linq 当您同时使用Split和FirstOrDefault方法时,空检查的最有效方法或最佳实践是什么?,linq,c#-4.0,split,null-check,Linq,C# 4.0,Split,Null Check,我同时使用Split和LastOrDefault方法,我使用这个代码块进行空检查。但对我来说,这似乎不是最有效的方法。因为我使用了很多check和&&运算符。看起来有点难看。有没有更好的方法来完成这个空检查?(我在网上搜索,但找不到相关答案。) 注:C语言版本4.0 这是我的密码: if (HttpContext.Current.Request.Url.AbsolutePath.Split('/') != null && HttpContext.Curre
if (HttpContext.Current.Request.Url.AbsolutePath.Split('/') != null &&
HttpContext.Current.Request.Url.AbsolutePath.Split('/').Length > 0 &&
HttpContext.Current.Request.Url.AbsolutePath.Split('/').Last() != null &&
HttpContext.Current.Request.Url.AbsolutePath.Split('/').Last().Split('.') != null &&
HttpContext.Current.Request.Url.AbsolutePath.Split('/').Last().Split('.').Length > 0 &&
HttpContext.Current.Request.Url.AbsolutePath.Split('/').Last().Split('.').First() != null)
{
pageName = HttpContext.Current.Request.Url.AbsolutePath.Split('/').LastOrDefault().Split('.').FirstOrDefault();
}
谢谢您的回答。这些测试都不需要: 首先,不要对同一数据多次运行
Split
:
var splitSlashAbsPath = HttpContext.Current.Request.Url.AbsolutePath.Split('/');
Split
的返回数组不能为空
// if (splitSlashAbsPath != null &&
// splitSlashAbsPath.Last() != null &&
// splitDotAbsPath != null &&
// splitDotAbsPath.First() != null)
// {
Split
的返回数组长度永远不能为零
// splitSlashAbsPath.Length > 0 &&
// splitDotAbsPath.Length > 0 &&
因此,从Last()
返回的值永远不能为空
// if (splitSlashAbsPath != null &&
// splitSlashAbsPath.Last() != null &&
// splitDotAbsPath != null &&
// splitDotAbsPath.First() != null)
// {
不要对同一数据多次运行split(并且对数组调用Last
没有意义)
Split
的返回数组不能为空
// if (splitSlashAbsPath != null &&
// splitSlashAbsPath.Last() != null &&
// splitDotAbsPath != null &&
// splitDotAbsPath.First() != null)
// {
Split
的返回数组长度永远不能为零
// splitSlashAbsPath.Length > 0 &&
// splitDotAbsPath.Length > 0 &&
因此,来自Split
的First()
// if (splitSlashAbsPath != null &&
// splitSlashAbsPath.Last() != null &&
// splitDotAbsPath != null &&
// splitDotAbsPath.First() != null)
// {
由于可以调用Last
,因此调用LastOrDefault
毫无意义
同样适用于FirstOrDefault
// pageName = splitDotAbsPath.FirstOrDefault();
在数组上首先调用
也没有意义
var splitDotAbsPath = splitSlashAbsPath[splitSlashAbsPath.Length-1].Split('.');
pageName = splitDotAbsPath[0];
// }
总之,你有:
var splitSlashAbsPath = HttpContext.Current.Request.Url.AbsolutePath.Split('/');
var splitDotAbsPath = splitSlashAbsPath[splitSlashAbsPath.Length-1].Split('.');
pageName = splitDotAbsPath[0];
但是,一般来说,使用Split
仅获取一个元素是非常低效的,因此这会更好:
var path = HttpContext.Current.Request.Url.AbsolutePath;
var pastSlashPos = path.LastIndexOf('/') + 1;
var countUntilDot = path.IndexOf('.', pastSlashPos);
countUntilDot = (countUntilDot >= 0 ? countUntilDot : path.Length) - pastSlashPos;
pageName = path.Substring(pastSlashPos, countUntilDot);
如果将.Last()
替换为.LastOrDefault()
,则不需要前面的长度检查,与First()
相同。如果使用的是C#4,则除了大量的&
,没有更好的选择。您可能希望在此过程中声明一些变量,以避免多次重新计算Split,但这不会变得更好。为什么使用旧的C版本?谢谢你的评论,拉西,我的公司有这么多的产品使用旧的.net/C版本,包括.net framework 2.0。他们在更改框架或语言版本方面有许多先决条件。因此无法升级版本。不是升级,而是完全开发整个产品。好的,但是您(以及您的团队、公司)知道更新C#并不一定需要更新的.NET框架,对吗?您需要一个更新的编译器,但它应该能够针对较旧的.NET框架,并且仍然使用较新的C#版本。当然,在较新的C#版本中,有些东西需要框架支持,但是如果您使用nuget软件包或自定义类来填充这些东西,或者不使用它们,那么您应该能够一直升级到至少C#7(我相信)。不过,如果你有政策的话,……事实上我也这么认为。当我搜索高级构建设置菜单或csproj中的LangVersion参数时,将用于更改语言版本。但我找不到任何visual studio 2019-2017-2015高级构建设置菜单或任何带有LangVersion配置参数的csproj。所以我不能改变它。我的WebForm项目不包含任何.csproj或等效文件。(我不擅长web表单,可能是web表单没有csproj文件。)Visual Studio 2019 web表单项目->右键单击->属性页->生成选项卡->没有高级生成设置选项。您好NetMage,谢谢您的回答。它实际上帮助很大。@cansu我应该放一个非拆分版本,我现在已经添加了。