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:'volume1C:'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"可以包含多级目录。

C#:Linq where 子句中的 if 条件

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);

我会做几件事:

  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));