Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:Linq where子句中的If条件_C#_Linq - Fatal编程技术网

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

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

我有一个像这样的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 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
    之类的类来更好地控制路径段。