C#从列表中删除冗余路径

时间:2010-06-10 09:08:03

标签: c# list path

说我有这个清单

List<string> sampleList = new List<string>
{
   "C:\\Folder1",
   "D:\\Folder2",
   "C:\\Folder1\\Folder3",
   "C:\\Folder111\\Folder4"
};

我想删除其他文件夹中包含的路径,例如我们有C:\ Folder1和C:\ Folder1 \ Folder3

列表的第三个条目应该消失,因为C:\ Folder1包含C:\ Folder1 \ Folder3

在.net框架中是否存在这样的问题,或者我是否必须自己编写算法?

3 个答案:

答案 0 :(得分:3)

我很可能会在规范化路径字符串上使用字符串操作:

path1 = Path.GetFullPath(path1);
path2 = Path.GetFullPath(path2);

// depending on os, ignore casing, eg by converting to lowercase

if (path1.StartsWith(path2)) 
{
  // ...
}

完整示例:

var normalizedPaths = sampleList
    .Select(x => Path.GetFullPath(x).ToLowerCase())
    .ToList();

var reducedList = normalizedPaths
    .Distinct()
    .Where(x => !normalizedPaths.Contains(
        y => y.StartsWith(x + Path.DirectorySeparatorChar)
        && x != y));

答案 1 :(得分:2)

假设它不是一个巨大的列表。

List<string> sampleList = new List<string>
{
   "C:\\Folder1",
   "D:\\Folder2",
   "C:\\Folder1\\Folder3",
   "C:\\Folder111\\Folder4",
   "C:\\Folder1"
};

string sep = Path.DirectorySeparatorChar.ToString();
List<string> shortList = sampleList.Where (l => 
    sampleList.Where(s => 
        l.StartsWith(s + (s.EndsWith(sep) ? String.Empty : sep)) && s != l).Count() == 0
).Distinct().ToList();

答案 2 :(得分:-3)

你应该自己做。你认为.net实现了一种方法来完成这样一个特定的任务吗?使用字符串方法。