通过单独的功能将列表中的项目相互比较

时间:2010-09-05 19:13:38

标签: c# linq list

我有一个函数检查字符串是否代表另一个字符串下面的文件系统位置。然而,我的问题应该适用于任何返回布尔值的函数。

无论如何这是函数​​......

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

}

我有一个List,其中包含我想要过滤的文件和文件夹路径(使用上面的功能),这样就不会发生嵌套。

这些路径

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

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

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

结果:

C:\Path
D:\

答案 1 :(得分:0)

尝试:

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

在您的代码中,您正在考虑每一对,并且必定至少有一个不是另一个的子路径。