- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么 String.IndexOf(String, StringComparison)
需要 StringComparison
并且不允许更一般的StringComparer
,甚至只是 IComparer<T>
或 IEqualityComparer<T>
?
我定制了一个StringComparer
与多个词典一起使用,我想在我的项目的其他部分使用它,但如果不做很多扩展方法,我找不到一个好的方法来做到这一点,如果这些方法可行的话。
这是我做的比较器。它大致基于以下建议:Implementing custom IComparer with string
另请注意,ModifyString 是一个 WIP。我希望根据我正在比较的输入,在那里添加更多的东西。我也知道它很贵,但我只是在寻找解决方案 ATM,而不是性能。
public class CustomComparer : StringComparer
{
public override int Compare(string x, string y)
{
return StringComparer.Ordinal.Compare(ModifyString(x), ModifyString(y));
}
public override bool Equals(string x, string y)
{
if (ModifyString(x).Equals(ModifyString(y)))
return true;
else
return false;
}
public override int GetHashCode(string obj)
{
if (obj == null)
return 0;
else
return ModifyString(obj).GetHashCode();
}
private string ModifyString(string s)
{
//I know this code is expensive/naaive, your suggestions are welcome.
s = s.ToLowerInvariant();
s = s.Trim();
s = Regex.Replace(s, @"\s+", " ");//replaces all whitespace characters with a single space.
return s;
}
}
最佳答案
使用 IEnumerable
的方便扩展似乎应该已经有了,您可以编写一个 String
扩展来使用 StringComparer
。正如评论中所建议的,所有可能的子字符串长度都在每个位置进行测试,因为无法对自定义 StringComparer
进行假设。
public static class IEnumerableExt {
public static T FirstOrDefault<T>(this IEnumerable<T> src, Func<T, bool> testFn, T defval) => src.Where(aT => testFn(aT)).DefaultIfEmpty(defval).First();
}
public static class StringExt {
public static int IndexOf(this string source, string match, StringComparer sc) {
return Enumerable.Range(0, source.Length) // for each position in the string
.FirstOrDefault(i => // find the first position where either
// match is Equal at this position for length of match (or to end of string) or
sc.Equals(source.Substring(i, Math.Min(match.Length, source.Length-i)), match) ||
// match is Equal to one of the substrings beginning at this position
Enumerable.Range(1, source.Length-i).Any(ml => sc.Equals(source.Substring(i, ml), match)),
-1 // else return -1 if no position matches
);
}
}
注意:已修改以正确处理源子字符串和匹配字符串长度可能不相等的情况。
关于c# - IndexOf 与自定义 StringComparer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50338199/
如果我想要一个不区分大小写的字符串键控字典,在给定这些约束的情况下,我应该使用哪个版本的 StringComparer: 字典中的键来自 C# 代码或仅以英语语言环境(美国或英国)编写的配置文件 软件
为什么 String.IndexOf(String, StringComparison)需要 StringComparison并且不允许更一般的StringComparer ,甚至只是 ICompar
某些 .NET 方法使用 StringComparison作为参数,有些使用 StringComparer (通常采用 IComparer 的形式)。差异是显而易见的。是否有一些优雅的方法如何从 St
我有一个 UTF-8 字符串列表,我想使用 Enumerable.OrderBy 对其进行排序.字符串可能包含任意数量的字符集 - 例如,英语、德语和日语,或者它们的混合,甚至。 例如,这是一个示例输
我有一个带有街道名称的 SortedList Dim orderedListStreet As New Generic.SortedList(Of String, String)(StringComp
我正在寻找一个具有支持通配符 (*) 和大小写敏感的 StringComparer 的快速 .NET 类/库。有什么想法吗? 最佳答案 您可以将 Regex 与 RegexOptions.Ignore
我正在尝试序列化/反序列化字典,问题是我用 StringComparer.OrdinalIgnoreCase 创建字典比较器。 这是我遇到的问题的代码片段: var dict = new Dictio
我正在尝试为 .Net core 1.0 重新定位一个可移植的 C# 库。 一旦我获得了该语言的 CultureInfo 对象(通过调用者设置的委托(delegate)),我曾经做过类似的事情来获得该
我需要使用全局化规则来搜索文档中出现的所有字符串。伪代码是: var searchText = "Hello, World"; var compareInfo = new CultureInfo("e
.NET5 的新手,所以不确定这是否简单。我的解决方案中还有 5 个其他项目,它们都在 project.json 文件中有这个 "frameworks": { "net5": { } } 我需
我一直在使用 StringComparer.CurrentCultureIgnoreCase用于不区分大小写的比较和散列。但是在检查了引用源之后,我看到它在每次调用时都会创建一个新实例(那么它不应该是
StringComparer.InvariantCultureIgnoreCase Equals 对“”与“\0”返回 true,但 GetHashCode 对两个字符串返回不同的值。这是错误吗? v
这两个类有什么区别? 我使用了 System.StringComparer.OrdinalIgnoreCase() 和 System.StringComparison.OrdinalIgnoreCas
我想用 Frama-c 和 WP 插件来表示,下面编写的 stringCompare 函数充当“它应该”的作用 - 即:给定相同的输入字符串,该函数返回 0 并且结果不同于 0如果字符串不相同。我已经
我在我的数据库和我的 C# 代码之间实现了一个缓存层。这个想法是根据查询的参数缓存某些数据库查询的结果。数据库使用默认排序规则 - SQL_Latin1_General_CP1_CI_AS 或 Lat
我有一本字典Dictionary> .外部字典和内部字典都有一个相等比较器集(在我的例子中是 StringComparer.OrdinalIgnoreCase )。字典序列化和反序列化后,两个字典的比
免责声明:也许是微 YAGNI 优化,但听我说.. 问题是实现 不区分大小写 查找表。 我的老派方式:在填充字典时,在插入之前将键大写。当有人给你一个查找键时,将键大写。 新方法(我今天了解了):字典
我是一名优秀的程序员,十分优秀!