参数失败时的自定义比较器

本文关键字:自定义 比较器 失败 参数 | 更新日期: 2023-09-27 18:08:37

我正在尝试编写一个自定义比较器,以便根据相似性对搜索结果列表进行排序。我希望与输入的搜索词最相似的词首先出现在列表中,然后是以搜索词开头的短语,然后是按字母顺序排列的所有其他值。

给定这个测试代码:

  string searchTerm = "fleas";
  List<string> list = new List<string>
                                       {
                                           "cat fleas",
                                           "dog fleas",
                                           "advantage fleas",
                                           "my cat has fleas",
                                           "fleas",
                                           "fleas on my cat"
                                       };

我正在尝试使用这个比较器:

public class MatchComparer : IComparer<string>
{
    private readonly string _searchTerm;
    public MatchComparer(string searchTerm)
    {
        _searchTerm = searchTerm;
    }
    public int Compare(string x, string y)
    {
        if (x.Equals(_searchTerm) ||
             y.Equals(_searchTerm))
            return 0;
        if (x.StartsWith(_searchTerm) ||
            y.StartsWith(_searchTerm))
            return 0;
        if (x.Contains(_searchTerm))
            return 1;
        if (y.Contains(_searchTerm))
            return 1;
        return x.CompareTo(y);
    }

调用列表。Sort(new MatchComparer(searchTerm))的结果是"我的猫有跳蚤"在列表的顶部。

我想我一定是在做一些奇怪的事情。这里有什么问题吗,还是有更好的方法来做我想做的事情?

谢谢!

参数失败时的自定义比较器

您没有使用CompareTo的所有可能返回值

-1 == x优先0 ==相等1 == y first

你想要更像这样的东西

public class MatchComparer : IComparer<string> 
{ 
    private readonly string _searchTerm; 
    public MatchComparer(string searchTerm) 
    { 
        _searchTerm = searchTerm; 
    } 
    public int Compare(string x, string y) 
    { 
        if (x.Equals(y)) return 0; // Both entries are equal;
        if (x.Equals(_searchTerm)) return -1; // first string is search term so must come first
        if (y.Equals(_searchTerm)) return 1; // second string is search term so must come first
        if (x.StartsWith(_searchTerm)) {
            // first string starts with search term
            // if second string also starts with search term sort alphabetically else first string first
            return (y.StartsWith(_searchTerm)) ? x.CompareTo(y) : -1;
        }; 
        if (y.StartsWith(_searchTerm)) return 1; // second string starts with search term so comes first
        if (x.Contains(_searchTerm)) {
            // first string contains search term
            // if second string also contains the search term sort alphabetically else first string first
            return (y.Contains(_searchTerm)) ? x.CompareTo(y) : -1; 
        }
        if (y.Contains(_searchTerm)) return 1; // second string contains search term so comes first
        return x.CompareTo(y); // fall back on alphabetic
    } 
}