C#:Linq where子句中的If条件
我有一个像这样的Linq查询C#:Linq where子句中的If条件,c#,linq,C#,Linq,我有一个像这样的Linq查询 var path = paths.Where(p=>input_path.ToUpper().Contains(p.ToUpper()).Select(p); 我在path变量中设置了C:\volume1和C:\volume10。输入路径的可能值为 "C:\volume1" "C:\volume1\myFolder\myfile.txt" "C:\volume10" "C:\volume10\myFolder\myfile.txt" 如果input\u p
var path = paths.Where(p=>input_path.ToUpper().Contains(p.ToUpper()).Select(p);
我在path
变量中设置了C:\volume1
和C:\volume10
。输入路径的可能值为
"C:\volume1"
"C:\volume1\myFolder\myfile.txt"
"C:\volume10"
"C:\volume10\myFolder\myfile.txt"
如果input\u path
设置为C:\volume10\myFolder\myfile.txt
,通过上述查询,它将返回我所期望的C:\volume1
。我想要一张像下面这样的支票
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\u path
长度大于path
长度时,才应进行“\”字符检查
编辑:
“路径”只包含驱动器号和一级目录,其中“输入路径”可以包含多级目录。这应该可以满足您的需要
var path = paths.Where(p => input_path.ToUpper().Contains(p.ToUpper()) && (input_path.length > p.length && input_path[p.length] == '\\'))
.Select(p => p);
这应该可以帮你
var path = paths.Where(p => input_path.ToUpper().Contains(p.ToUpper()) && (input_path.length > p.length && input_path[p.length] == '\\'))
.Select(p => p);
LINQ方法中的lambda可以有两个语法-an或A
表达式是计算为值的东西。例如,它是指作业右侧的内容,默认情况下,它是指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;
}
尽管在您的例子中,语句语法是非常精心设计的,而且第一种似乎是最简单的。LINQ方法中的lambda可以有两种语法-an或A
表达式是计算为值的东西。例如,它是指作业右侧的内容,默认情况下,它是指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;
}
尽管在您的例子中,语句语法非常复杂,第一种似乎最简单。如果您只需要输入路径的子文件夹上的路径,您只需检查路径是否以您的输入路径开始(如果需要,在末尾添加“\”)
如果只需要输入路径子文件夹上的路径,只需检查路径是否以输入路径开头(必要时在末尾添加“\”)
您可以尝试以下方法:
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] == '\\'));
只有当input\u path.Length>p.Length为true时,它才会检查input\u path[p.Length]='\'条件。我会做几件事:
摆脱Where
,只需使用Select
如果总是比较字符串的开头,请使用StartsWith
而不是Contains
(和ToUpper
)StartsWith
使用比较器,因此您可以指定它忽略大小写
我会做几件事:
摆脱Where
,只需使用Select
如果总是比较字符串的开头,请使用StartsWith
而不是Contains
(和ToUpper
)StartsWith
使用比较器,因此您可以指定它忽略大小写
删除如果
,然后将更改为&&如果要搜索精确匹配,为什么要使用Contains?使用simply==我想知道如果“路径”和“输入路径”都包含“C:\volume10”,这是否会起作用。这里的长度是一样的。@Steve不是==
,因为它仍然是部分匹配,但可以通过使用StartsWith
来改进它。作为不相关的旁白,这里有几种做法通常是导致错误的坏主意。第一种方法是在使用StringComparison时,使用ToUpper
/ToLower
进行字符串匹配。第二种方法是手动解析路径,当您可以使用诸如System.IO.Directory
或System.Uri
之类的类来获得对路径段的更多控制时。删除if
,并将更改为&&如果您正在搜索精确匹配,为什么要使用Contains?使用simply==我想知道如果“路径”和“输入路径”都包含“C:\volume10”,这是否会起作用。这里的长度是一样的。@Steve不是==
,因为它仍然是部分匹配,但可以通过使用StartsWith
来改进它。作为不相关的旁白,这里有几种做法通常是导致错误的坏主意。第一种方法是在使用StringComparison时,使用ToUpper
/ToLower
进行字符串匹配。第二种是手动解析路径,您可以使用System.IO.Directory
或System.Uri
之类的类来更好地控制路径段。