在我的应用程序中,我有一个选项,可以显示当前艺术家的专辑列表,这些专辑不在音乐库中。为此,我调用音乐API来获取该艺术家的所有专辑列表,然后删除当前库中的专辑。
为了应对名称的不同大小写以及标题中可能出现的遗漏(或额外标点符号),我写了一篇
IEqualityComparer
用于
.Except
呼叫
var missingAlbums = allAbumns.Except(ownedAlbums, new NameComparer());
这是
Equals
方法
public bool Equals(string x, string y)
{
if (ReferenceEquals(x, y)) return true;
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)
{
if (obj is null) return 0;
return obj.ToLower().GetHashCode();
}
当然,当字符串包含符号时,这会失败,因为我在获得哈希码之前没有删除它们,所以即使转换为小写,这两个字符串(例如“Baa,Baa,black sheep”和“Baa-Baa-black sheet”)仍然不相等。
我已经写了一个方法来去除符号,但这意味着我必须猜测这些符号到底是什么。它适用于我迄今为止尝试过的案例,但我预计它最终会失败。我想要一种更可靠的去除符号的方法。
考虑到
CompareOptions.IgnoreSymbols
存在,是否有一种方法可以调用,将这些字符从字符串中剥离?或者如果失败,一个将返回所有符号的方法?
我找到了
IsPunctuation
方法,但我无法确定它所认为的标点符号是否与字符串比较选项所认为的符号相同。