繁体   English   中英

C#:如果条件在Linq where子句中

[英]C#: If condition in Linq where clause

我有这样的Linq查询...

var path = paths.Where(p=>input_path.ToUpper().Contains(p.ToUpper()).Select(p);

我在paths变量中有C:\\volume1C:\\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);

我会做几件事:

  1. 摆脱Where并使用Select代码要快一些(且键入更少)
  2. 如果您始终在比较字符串的开头,请使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM