我是这样的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进行操作? " \"只有当input_path
长度超过path
长度时才会进行字符检查。
编辑: "路径和#34;仅包含驱动器号和第一级目录,其中为" input_path"可以包含多级目录。
答案 0 :(得分:4)
LINQ方法中的lambda可以有两种语法 - expression或statement。
表达式是评估值的东西。例如,这是你在作业右侧可以拥有的,默认情况下,它就是你在lambda中所拥有的。如果你想要一个复杂的表达式,你可以使用像&&amp ;;这样的逻辑运算符。或||或者?:三元组将条件组合成一个复合逻辑表达式,其计算结果为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;
}
虽然在你的情况下,语句语法是非常人为的,第一个似乎是最简单的。
答案 1 :(得分:2)
如果只需要input_path的子文件夹上的路径,您只需检查路径是否以您的输入路径开头(如果需要,在末尾添加“\”)
input_path = input_path.EndsWith('\\') ? input_path : input_path + '\\';
var path = paths.Where(p=> p.ToUpper().StartsWith(input_path.ToUpper())).Select(p);
`
答案 2 :(得分:1)
你可以试试这个:
var path = paths.Where(p => input_path.ToUpper().Contains(p.ToUpper())
&& (input_path.Length > p.Length && input_path[p.Length] == '\\'));
仅当input_path.Length> gt;它才会检查input_path [p.Length] =='\'条件。 p.Length是真的。
答案 3 :(得分:0)
这应该为你做
var path = paths.Where(p => input_path.ToUpper().Contains(p.ToUpper()) && (input_path.length > p.length && input_path[p.length] == '\\'))
.Select(p => p);
答案 4 :(得分:0)
我会做几件事:
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));