Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 当您同时使用Split和FirstOrDefault方法时,空检查的最有效方法或最佳实践是什么?_Linq_C# 4.0_Split_Null Check - Fatal编程技术网

Linq 当您同时使用Split和FirstOrDefault方法时,空检查的最有效方法或最佳实践是什么?

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

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

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

谢谢您的回答。

这些测试都不需要:

首先,不要对同一数据多次运行
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我应该放一个非拆分版本,我现在已经添加了。