C#:Linq where 子句中的 if 条件
本文关键字:if 条件 子句 Linq where | 更新日期: 2023-09-27 18:31:36
我有一个这样的 Linq 查询...
var path = paths.Where(p=>input_path.ToUpper().Contains(p.ToUpper()).Select(p);
我已经C:'volume1
并C:'volume10
paths
变量。input_path
的可能值为
"C:'volume1"
"C:'volume1'myFolder'myfile.txt"
"C:'volume10"
"C:'volume10'myFolder'myfile.txt"
如果input_path
设置为 C:'volume10'myFolder'myfile.txt
,则通过上述查询,它将返回我C:'volume1
我期望C:'volume10
的位置。我想检查一下,
var path = paths.Where(p=>input_path.ToUpper().Contains(p.ToUpper()) && (if input_path.length > p.length then if input_path[p.length] == '''') ).Select(p);
如何使用 Linq 执行此操作?仅当长度超过 path
长度时,才应进行"''"字符检查input_path
。
编辑:"路径"仅包含驱动器号和第一级目录,其中"input_path"可以包含多级目录。
LINQ 方法中的 lambda 可以有两种语法 - 表达式或语句。
表达式是计算结果为值的东西。例如,这是您可以在分配右侧拥有的内容,默认情况下,它是您在 lambda 中拥有的内容。如果你想要一个复杂的表达式,你可以使用逻辑运算符,如 && 或 ||或 ?: 三元,将条件组合成一个复合逻辑表达式,其计算结果为 True 或 False。
paths.Where (p => input_path.Contains(p)
&& (input_path.Length > p.Length && input_path[p.length] == ''''))
或者,您可以通过简单地将代码包装在一组 {} 中使用 lambda 语句,然后您可以编写一个完整的语句块,使用 return
返回一个值:
paths.Where(p =>
{
if (input_path.Contains(p))
if (input_path.length > p)
if (input_path[p.length] = '''')
{
return true;
}
return false;
}
尽管在您的情况下,语句语法非常人为,第一个似乎最简单。
如果您只需要input_path子文件夹上的路径,您可以简单地检查路径是否以您的输入路径开头(如有必要,在末尾添加"''")
input_path = input_path.EndsWith('''') ? input_path : input_path + '''';
var path = paths.Where(p=> p.ToUpper().StartsWith(input_path.ToUpper())).Select(p);
`
你可以试试这个:
var path = paths.Where(p => input_path.ToUpper().Contains(p.ToUpper())
&& (input_path.Length > p.Length && input_path[p.Length] == ''''));
只有在input_path时,它才会检查input_path[p.Length] == '''' 条件。长度> p.长度是真的。
这应该为你做
var path = paths.Where(p => input_path.ToUpper().Contains(p.ToUpper()) && (input_path.length > p.length && input_path[p.length] == ''''))
.Select(p => p);
我会做几件事:
- 它
- 的代码速度稍快(打字更少),可以摆脱
Where
,只使用Select
- 如果始终比较字符串的开头,请使用
StartsWith
而不是Contains
(和ToUpper
)。StartsWith
采用比较器,因此您可以指定它忽略大小写
.
// Rules:
// if input_path is longer than path, then see if it begins with path
// (case-insensitive) and check for the backslash character
// otherwise, the two strings should be equal (case-insensitive)
var path = paths.Select(p =>
(input_path.Length > p.Length &&
input_path.StartsWith(p, StringComparison.OrdinalIgnoreCase) &&
input_path[p.Length] == '''') ||
input_path.Equals(p, StringComparison.OrdinalIgnoreCase));