如何解决我需要从字符串中去除所有符号,以创建一个忽略标点符号的“IEqualityComparer”
在我的应用程序的一部分中,我有一个选项可以显示当前艺术家不在音乐库中的专辑列表。为此,我调用音乐 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,blacksheep”和“Baa baa Blacksheep”)仍然是即使转换为小写也不相等。
我写了一个方法来去除符号,但这意味着我必须猜测这些符号到底是什么。它适用于我迄今为止尝试过的情况,但我预计它最终会失败。我想要一种更可靠的方法来删除符号。
鉴于 CompareOptions.IgnoreSymbols
存在,有没有我可以调用的方法来从字符串中去除这些字符?或者失败了,一个将返回所有符号的方法?
我找到了字符的 IsPunctuation
方法,但我无法确定它认为是标点符号的内容是否与字符串比较选项认为是符号的内容相同。
解决方法
如果您打算使用 CompareOptions
枚举,我觉得您不妨将它与记录为专为它设计的 CompareInfo
类一起使用:
定义与 CompareInfo 一起使用的字符串比较选项。
然后您就可以使用该类中的 GetHashCode(string,CompareOptions)
方法(如果您愿意,甚至可以使用 Compare(string,string,CompareOptions)
方法)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。