[英]C#: If condition in Linq where clause
我有这样的Linq查询...
var path = paths.Where(p=>input_path.ToUpper().Contains(p.ToUpper()).Select(p);
我在paths
变量中有C:\\volume1
和C:\\volume10
。 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进行操作? 仅当input_path
长度大于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.Length> p.Length为true时,才会检查input_path [p.Length] =='\\'条件。
这应该为你做
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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.