按特异性对通配符匹配列表进行排序

时间:2012-06-11 22:13:51

标签: c# sorting

给出一个像这样的字符串列表:

a/b/*/lol/cats
*/*
foo/bar/**
foo/bar/*/C/**

您如何按特异性对它们进行排序?

我天真的方法(适用于我的大多数测试用例)如下:

var sorted = wildCards
    .OrderBy(c => c.HasCatchAll)
    .ThenBy(c => c.NumWildCards)
    .ThenByDescending(c => c.Pattern.Length);

在上面的代码中,HasCatchAll属性表示字符串末尾有一个**(**的唯一有效位置)。

我的上述理由是,**的任何内容都不如没有外卡的特定内容,而且你拥有的外卡越多,你的特定性就越低。也就是说,上述情况将失败:

*/hi/*/*
*/*/hi/*

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

假设你有一个比较函数,那么为你的列表构建排序算法很容易。

问题是如何定义这样的功能。也许你可以这样定义:

  • 两个字符串作为输入(a,b)
  • 如果两个字符串彼此匹配=> a == b
  • 如果两个字符串彼此不匹配=>更详细的比较,比如你的HasCatch东西...
  • 如果第一个字符串匹配第二个=> a< B'/ LI>
  • 如果第二个字符串匹配第一个=> a> B'/ LI>

匹配例如是:*foo。这里*匹配foo,但不是相反。

使用此功能,您可以覆盖案例

*/hi/*/*
*/*/hi/*

这会说两者都相互匹配,这意味着它们具有相同的顺序。

长话短说:我不认为你的解决方案失败了。将这两个字符串定义为“相等”,没有?

是有意义的

第二个想法:如果你在这样的字符串中优先考虑你的条目:1/2/3/4 ....你也可以规避你的问题..在这种情况下*/hi/*/*更具体