C#:在这种情况下,如何过滤掉不需要的命名空间?

时间:2016-02-07 19:22:01

标签: c# .net namespaces

这更像是一个与语言无关的问题而不是C#特定的问题,但由于它处理命名空间,我认为我将其标记为与.NET相关。

假设您有一堆代表名称空间的字符串:

[
    "System",
    "System.Windows",
    "System.Windows.Input",
    "System.Windows.Converters",
    "System.Windows.Markup",
    "System.Windows.Markup.Primitives",
    "System.IO",
    "System.IO.Packaging"
]

您希望以这样的方式过滤它们,即排除“包含”集合中另一个命名空间的任何命名空间。例如,由于System包含System.Windows,因此将其排除在外。由于System.IOSystem.IO.Packaging的父级,因此同样会将其排除在外。这一直持续到你最终得到这个:

[
    "System.Windows.Input",
    "System.Windows.Converters",
    "System.Windows.Markup.Primitives",
    "System.IO.Packaging"
]

在C#中以这种方式过滤列表的有效方法是什么?我正在寻找一种看起来像这样的方法:

public IEnumerable<string> FilterNamespaces(IEnumerable<string> namespaces) {}

任何帮助将不胜感激,谢谢!

编辑:以下是最终对我有用的内容:

public IEnumerable<string> FilterNamespaces(IEnumerable<string> namespaces) =>
    namespaces.Where(current => !namespaces.Any(n => n.StartsWith($"{current}.")));

2 个答案:

答案 0 :(得分:2)

尝试以下

 public static IEnumerable<string> FilterNamespaces(IEnumerable<string> namespaces)
 => namespaces
  .Where(ns => namespaces
    .Where(n => n != ns)
      .All(n => !Regex.IsMatch(n, $@"{Regex.Escape(ns)}[\.\n]")))
  .Distinct();   

答案 1 :(得分:2)

您可以构建一个树,其中根是System命名空间,每个边将表示不同命名空间之间的父子关系。然后你可以用遍历算法找到树的所有叶子,找到每个节点的等级(秩= 1的节点是叶子 - 他们没有孩子)。