【问题标题】:What is the most efficient way or best practice for null check when you use Split and FirstOrDefault methods together?当您同时使用 Split 和 FirstOrDefault 方法时,空值检查的最有效方法或最佳实践是什么?
【发布时间】:2020-04-12 18:42:14
【问题描述】:

我同时使用 Split 和 LastOrDefault 方法,我使用此代码块进行空检查。但这对我来说似乎不是最有效的方法。因为我使用了很多检查和 && 运算符。好像有点难看。有没有办法以更好的方式完成这个空检查? (我在网上搜索但找不到相关答案。)

注意:C# 语言版本 4.0

这是我的代码:

    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();
    }

感谢所有回答。

【问题讨论】:

  • 如果将.Last() 替换为.LastOrDefault(),则不需要前面的长度检查,与First() 相同。
  • 如果您使用的是 C# 4,那么没有比拥有大量 && 更好的选择了。您可能希望在此过程中声明一些变量以避免多次重新评估 Split,但它不会变得更好。为什么是旧的 C# 版本?
  • 感谢您对 Lasse 的评论,我的公司有很多 .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 或等效文件。 (我不擅长WebForm,可能是web表单没有csproj文件。)Visual Studio 2019 webform项目->右键->属性页->构建选项卡->没有高级构建设置选项。跨度>

标签: linq c#-4.0 split null-check


【解决方案1】:

测试都不需要:

首先,不要在同一数据上多次运行Split

var splitSlashAbsPath = HttpContext.Current.Request.Url.AbsolutePath.Split('/');

Split 的返回数组永远不能为空

//    if (splitSlashAbsPath != null &&

Split 的返回数组永远不能为零长度

//        splitSlashAbsPath.Length > 0 &&

所以Last() 的返回值永远不能为空

//        splitSlashAbsPath.Last() != null &&

不要对同一数据多次运行 split(并且在数组上调用 Last 没有意义)

var splitDotAbsPath = splitSlashAbsPath[splitSlashAbsPath.Length-1].Split('.');

Split 的返回数组永远不能为空

//        splitDotAbsPath != null &&

Split 的返回数组永远不能为零长度

//        splitDotAbsPath.Length > 0 &&

所以,Split 中的 First() 永远不能为空

//        splitDotAbsPath.First() != null)
//    {

既然你可以打电话给Last,那么打电话给LastOrDefault是没有意义的 FirstOrDefault也一样

//        pageName = splitDotAbsPath.FirstOrDefault();

在数组上调用 First 也没有意义

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);

【讨论】:

  • 您好 NetMage,感谢您的回答。它实际上有很大帮助。
  • @cansu 我应该放一个非拆分版本,我现在已经添加了。
猜你喜欢
  • 2013-06-05
  • 1970-01-01
  • 2012-09-04
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 2013-01-14
  • 1970-01-01
相关资源
最近更新 更多