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

I need to strip all the symbols from a string in order to create an `IEqualityComparer` that ignores punctuation symbols

在我的应用程序的一部分中,我有一个选项可以显示当前艺术家不在音乐库中的专辑列表。为此,我调用 music 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 sheep”)即使转换为小写后仍然不相等。

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

鉴于 CompareOptions.IgnoreSymbols 存在,是否有我可以调用的方法从字符串中去除这些字符?或者失败了,一种方法将 return 所有符号?

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

如果您要使用 CompareOptions enum, I feel like you might as well use it with the CompareInfo class,它被记录为设计用于:

Defines the string comparison options to use with CompareInfo.

那你就可以用GetHashCode(string, CompareOptions) method from that class (and even the Compare(string, string, CompareOptions)方法了。