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

时间:2014-11-24 09:30:09

标签: c# linq

我是这样的Linq查询...

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

我在C:\volume1变量中C:\volume10pathsinput_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"可以包含多级目录。

5 个答案:

答案 0 :(得分:4)

LINQ方法中的lambda可以有两种语法 - expressionstatement

表达式是评估值的东西。例如,这是你在作业右侧可以拥有的,默认情况下,它就是你在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)

我会做几件事:

  1. 摆脱Where并使用Select
  2. 的代码稍微快一些(并减少打字)
  3. 如果您一直在比较字符串的开头,请使用StartsWith代替Contains(和ToUpper)。 StartsWith采用比较器,因此您可以指定它忽略大小写
  4. // 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));