【问题标题】:Compare items in a List to each other, by a seperate function通过单独的函数将列表中的项目相互比较
【发布时间】:2010-09-05 19:13:37
【问题描述】:

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

无论如何,这里是函数......

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:\Path\SubPath
  • C:\Path\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();

感谢您的帮助。

【问题讨论】:

    标签: c# linq list


    【解决方案1】:

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

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

    结果:

    C:\路径 D:\

    【讨论】:

      【解决方案2】:

      试试:

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

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

      【讨论】:

      • 我喜欢这个,因为它比上面的更具可读性,但它错过了没有孩子的项目。将@"E:\Path" 添加到我上面的路径中进行测试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      相关资源
      最近更新 更多