给出一个像这样的字符串列表:
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/*
非常感谢任何帮助。
答案 0 :(得分:1)
假设你有一个比较函数,那么为你的列表构建排序算法很容易。
问题是如何定义这样的功能。也许你可以这样定义:
匹配例如是:*
和foo
。这里*
匹配foo
,但不是相反。
使用此功能,您可以覆盖案例
*/hi/*/*
*/*/hi/*
这会说两者都相互匹配,这意味着它们具有相同的顺序。
长话短说:我不认为你的解决方案失败了。将这两个字符串定义为“相等”,没有?
是有意义的第二个想法:如果你在这样的字符串中优先考虑你的条目:1/2/3/4 ....你也可以规避你的问题..在这种情况下*/hi/*/*
更具体