代码之家  ›  专栏  ›  技术社区  ›  ChrisF

我需要从字符串中删除所有符号,以便创建一个忽略标点符号的“IEqualityComparer”

  •  0
  • ChrisF  · 技术社区  · 3 年前

    在我的应用程序中,我有一个选项,可以显示当前艺术家的专辑列表,这些专辑不在音乐库中。为此,我调用音乐API来获取该艺术家的所有专辑列表,然后删除当前库中的专辑。

    为了应对名称的不同大小写以及标题中可能出现的遗漏(或额外标点符号),我写了一篇 IEqualityComparer 用于 .Except 呼叫

    var missingAlbums = allAbumns.Except(ownedAlbums, new NameComparer());
    

    这是 Equals 方法

    public bool Equals(string x, string y)
    {
        // Check whether the compared objects reference the same data.
        if (ReferenceEquals(x, y)) return true;
    
        // Check whether any of the compared objects is null.
        if (x is null || y is null)
            return false;
    
        return string.Compare(x, y, CultureInfo.CurrentCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreSymbols) == 0;
    }
    

    这是 GetHashCode 方法

    public int GetHashCode(string obj)
    {
        // Check whether the object is null
        if (obj is null) return 0;
    
        // Make lower case. How do I strip symbols?
        return obj.ToLower().GetHashCode();
    }
    

    当然,当字符串包含符号时,这会失败,因为我在获得哈希码之前没有删除它们,所以即使转换为小写,这两个字符串(例如“Baa,Baa,black sheep”和“Baa-Baa-black sheet”)仍然不相等。

    我已经写了一个方法来去除符号,但这意味着我必须猜测这些符号到底是什么。它适用于我迄今为止尝试过的案例,但我预计它最终会失败。我想要一种更可靠的去除符号的方法。

    考虑到 CompareOptions.IgnoreSymbols 存在,是否有一种方法可以调用,将这些字符从字符串中剥离?或者如果失败,一个将返回所有符号的方法?

    我找到了 IsPunctuation 方法,但我无法确定它所认为的标点符号是否与字符串比较选项所认为的符号相同。

    0 回复  |  直到 3 年前
        1
  •  7
  •   Peter Duniho    3 年前

    如果您要使用 CompareOptions enum,我觉得你还不如把它和 CompareInfo 它被记录为设计用于的类:

    定义要与一起使用的字符串比较选项 CompareInfo .

    然后你可以使用 GetHashCode(string, CompareOptions) 该类的方法(甚至 Compare(string, string, CompareOptions) 方法,如果你喜欢的话)。