2011-05-20 68 views
3

我正在学习LINQ,希望能帮助下面的方法。我如何重写下面的方法来使用LINQ?LINQ等价于下面的代码?

private bool IsInList(string file, List<FileInfo> excelList) 
{ 
    if (excelList != null && excelList.Count > 0) 
    { 
     foreach (FileInfo f in excelList) 
     { 
      if (string.Compare(f.FullName, file, StringComparison.OrdinalIgnoreCase) == 0) 
      { 
       return true; 
      } 
     } 
    } 

    return false; 
} 

回答

7

我会改变的第二个参数接受IEnumerable<FileInfo>代替你不限制自己只是列出。

private bool IsInList(string file, IEnumerable<FileInfo> excelList) 
{ 
    return excelList != null && excelList.Any(f => f.FullName.Equals(file, StringComparison.OrdinalIgnoreCase)); 
} 
+0

从技术上讲,这不是等价的:当FullName为null时,您的代码可能会引发异常,原来的代码不会。 – ChrisWue 2011-05-20 03:38:00

+0

谢谢,我喜欢单线。出于某种原因,我试图用Where()来做到这一点。我只是跳进LINQ,感谢您的快速回复。 – linqlearner 2011-05-20 03:42:32

+0

@Chris:我已经想过了,得出的结论是'FullName'永远不会是'null'。我很确定是这样。对我而言,没有任何理由让他们在任何情况下都返回null。否则,使用静态相等比较器将是一个简单的修复。 – 2011-05-20 03:45:57

3

使用lambda表达式:

private bool IsInList(string file, List<FileInfo> excelList) 
{ 
    return excelList != null && excelList.Any(f => string.Compare(f.FullName, file, StringComparison.OrdinalIgnoreCase) == 0); 
} 
+0

为什么downvote? – 2011-05-20 03:32:12

+0

可能是因为你在之前没有投掷过一次的情况下抛出异常。 * – 2011-05-20 03:34:16

+0

不是我的失望:你已经改变了代码的语义,没有任何明显的原因(抛出异常) – ChrisWue 2011-05-20 03:35:30

0

试试这个 - 完全未经测试。

private bool IsInList(string file, List<FileInfo> excelList) 
{ 
    if (excelList != null && excelList.Count > 0) 
    { 
     return excelList.Any(f => string.Compare(f.FullName, file, StringComparison.OrdinalIgnoreCase) == 0); 
    } 

    return false; 
} 
0

这应该做...

if (excelList != null && excelList.Count > 0) 
{ 
    return (from f in excelList 
      where (string.Compare(f.FullName, file, StringComparison.OrdinalIgnoreCase) == 0) 
      select f).Any(); 
} 
return false; 
1

事情是这样的:

private bool IsInList(string file, List<FileInfo> excelList) 
{ 
    if (excelList == null) return false; 
    return excelList.Any(f => string.Compare(f.FullName, file, StringComparison.OrdinalIgnoreCase) == 0)); 
}