当您同时使用 Split 和 FirstOrDefault 方法时,空值检查的最有效方法或最佳实践是什么?
What is the most efficient way or best practice for null check when you use Split and FirstOrDefault methods together?
我同时使用 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();
}
谢谢大家的回答。
测试都不需要:
首先,不要对同一个数据运行Split
多次:
var splitSlashAbsPath = HttpContext.Current.Request.Url.AbsolutePath.Split('/');
来自 Split
的 return 数组永远不能为 null
// if (splitSlashAbsPath != null &&
Split
中的 return 数组永远不能为零长度
// splitSlashAbsPath.Length > 0 &&
所以 Last()
中的 return 永远不会为 null
// splitSlashAbsPath.Last() != null &&
不要 运行 对同一数据进行多次拆分(并且对数组调用 Last
没有意义)
var splitDotAbsPath = splitSlashAbsPath[splitSlashAbsPath.Length-1].Split('.');
Split
中的 return 数组永远不能为 null
// splitDotAbsPath != null &&
Split
中的 return 数组永远不能为零长度
// splitDotAbsPath.Length > 0 &&
因此,Split
中的 First()
永远不会为 null
// 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);
我同时使用 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();
}
谢谢大家的回答。
测试都不需要:
首先,不要对同一个数据运行Split
多次:
var splitSlashAbsPath = HttpContext.Current.Request.Url.AbsolutePath.Split('/');
来自 Split
的 return 数组永远不能为 null
// if (splitSlashAbsPath != null &&
Split
中的 return 数组永远不能为零长度
// splitSlashAbsPath.Length > 0 &&
所以 Last()
中的 return 永远不会为 null
// splitSlashAbsPath.Last() != null &&
不要 运行 对同一数据进行多次拆分(并且对数组调用 Last
没有意义)
var splitDotAbsPath = splitSlashAbsPath[splitSlashAbsPath.Length-1].Split('.');
Split
中的 return 数组永远不能为 null
// splitDotAbsPath != null &&
Split
中的 return 数组永远不能为零长度
// splitDotAbsPath.Length > 0 &&
因此,Split
中的 First()
永远不会为 null
// 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);