2010-09-05 50 views
2

我有一个函数,用于检查字符串是否代表另一个字符串下的文件系统位置。然而,我的问题应该适用于返回布尔值的任何函数。通过单独的函数将列表中的项目彼此比较

这里是无论如何功能...

private bool IsItemBelowPath(string item, string path) 
{ 

    if (path == Path.GetPathRoot(path)) 
    { 
     path = path.TrimEnd('\\'); 
    } 

    if (item.Length < path.Length + 2) 
     return false; 

    return (string.Compare(item, 0, path, 0, path.Length, StringComparison.OrdinalIgnoreCase) == 0 && 
     item[path.Length] == Path.DirectorySeparatorChar); 

} 

我有一个包含我喜欢滤波器(以上功能),所以没有发生嵌套文件和文件夹的路径列表。

这些路径

  • C:\路径
  • C:\路径\子路径
  • C:\路径\ FILE.TXT
  • d:\
  • d:\路径
  • D:\ File.txt

应该成为

  • C:\路径
  • d:\

我需要比较与所有其他的所有路径,并返回正确的。

我是很新的发展,但怀疑LINQ语句,用上面的功能,能做到这一点,我已经试过以下,但它给出错误的结果

var items = new List<string> { my paths.... } 

return (from i1 in items 
     from i2 in items 
     where !IsItemBelowPath(i1, i2) 
     select i2).Distinct().ToList(); 

感谢您的帮助。

回答

4

另一种方法更易于阅读,具有更好的性能,并给出正确的结果是迭代的项目和使用Any来测试是否有任何其他的项目是该项目的子路径:

var query = items 
    .Where(i1 => !items.Any(i2 => IsItemBelowPath(i1, i2))) 
    .ToList(); 

结果:

 
C:\Path 
D:\ 
+0

感谢您看起来像您的示例正在工作 – risc 2010-09-05 19:56:27

0

尝试:

return (from item in items 
     where items.Any(parent => IsItemBelowPath(parent,item)) 
     select item); 

在你的代码中,你正在考虑每一对,至少有一个不是另一个的子路径。

+0

我喜欢这个,因为它比上面的更具可读性,但它会漏掉没有孩子的项目。将@“E:\ Path”添加到我上面的路径中进行测试。 – risc 2010-09-05 19:57:24

相关问题