问题标签 [stringcomparer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1900 浏览

c# - System.StringComparer 支持通配符 (*)

我正在寻找一个快速的.NET 类/库,它有一个支持通配符 (*) 和大小写敏感的 StringComparer。有任何想法吗?

0 投票
5 回答
812 浏览

php - 如何比较文本

就像标题一样,如何比较文本?例如,请访问 textdiff.com。

0 投票
4 回答
3585 浏览

c# - 匿名类型可以从另一种类型继承吗?

根据关于该StringComparer.OrdinalIgnoreCase属性的 MSDN 文档:

OrdinalIgnoreCase 属性实际上返回从StringComparer类派生的匿名类的实例。

这是我不熟悉的特性——具有继承的匿名类型吗?还是作者所说的“匿名类”只是指“来自 的内部类StringComparer,对客户端代码不可见”?

0 投票
4 回答
3965 浏览

c# - 什么 .NET StringComparer 相当于 SQL 的 Latin1_General_CI_AS

我正在我的数据库和我的 C# 代码之间实现一个缓存层。这个想法是根据查询的参数缓存某些数据库查询的结果。数据库使用默认排序规则 -SQL_Latin1_General_CP1_CI_ASLatin1_General_CI_AS,基于一些简短的谷歌搜索,我相信它等同于相等,只是排序不同。

我需要一个 .NET StringComparer,它可以给我相同的行为,至少对于相等性测试和哈希码生成,因为数据库的排序规则正在使用。目标是能够在 C# 代码中使用 .NET 字典中的 StringComparer 来确定特定的字符串键是否已经在缓存中。

一个非常简单的例子:

StringComparer 与数据库的排序规则匹配很重要的原因是误报和漏报都会对代码产生不良影响。

如果 StringComparer 说当数据库认为两个键 A 和 B 是不同的时它们是相等的,那么数据库中可能有两行具有这两个键,但是如果要求 A 和B 连续 - 因为 B 的 get 将错误地命中缓存并返回为 A 检索的对象。

如果 StringComparer 在数据库认为 A 和 B 相等的情况下说 A 和 B 是不同的,那么问题就更加微妙了,但问题同样如此。两个键的 GetObject 调用都可以,并返回对应于同一数据库行的对象。但是随后使用键 A 调用 SaveObject 会使缓存不正确;对于具有旧数据的键 B,仍然会有一个缓存条目。随后的 GetObject(B) 将提供过时的信息。

因此,为了使我的代码正常工作,我需要 StringComparer 来匹配数据库行为以进行相等性测试和哈希码生成。到目前为止,我的谷歌搜索已经产生了很多关于 SQL 排序规则和 .NET 比较并不完全等价的信息,但没有详细说明差异是什么,它们是否仅限于排序差异,或者是否有可能找到如果不需要通用解决方案,则等效于特定SQL 排序规则的 StringComparer。

(旁注 - 缓存层是通用的,所以我不能对密钥的性质和排序规则是否合适做出特别的假设。我数据库中的所有表共享相同的默认服务器排序规则。我只需要匹配存在的排序规则)

0 投票
1 回答
170 浏览

c# - 如何在 C# 中确定字典比较器的类型?

我需要确定我在函数中收到的字典是否具有不区分大小写的比较器。

IE。不区分大小写的字典声明如下:

当我将字典接收到我的函数中时,我可以访问 .Comparer 属性并检查它的类型 - 但是我似乎得到的只是 -

如何确定正在使用的比较器是否为 StringComparer.OrdinalIgnoreCase?

0 投票
1 回答
1652 浏览

c# - c# 排序列表.ContainsKey 成功添加键返回 false

检查下面的更新 3 我发现我遇到的问题与 .Net 4.0、4.0 客户端和 4.5 的 c# 字符串比较器的已知严重问题有关,这将导致字符串列表的排序顺序不一致(导致输出依赖关于输入的顺序和使用的排序算法)。该问题已于 2012 年 12 月报告给 Microsoft,并以“无法修复”的形式关闭。可以使用一种变通方法,但是速度要慢得多,以至于对于大型集合几乎不实用。

在实现不可变的 PatriciaTrie 时,我想将其性能与 System.Collections.Generic.SortedList 进行比较。我使用以下文件https://github.com/rkapsi/patricia-trie/blob/master/src/test/resources/org/ardverk/collection/hamlet.txt来创建用于测试的输入词表。

在 c# SortedList 中插入每个单词时,使用Comparer<string>.DefaultStringComparer.InvariantCulture作为键比较器,无法使用正常搜索方法检索成功插入的许多条目(例如ContainsKey返回 false),但键在列表中显示为通过迭代列表来观察。

更奇怪的是,比较器在将从排序列表中检索到的键与使用找不到的搜索键进行比较时返回值“0” ContainsKey

下面的完整示例演示了我的系统上的这个问题。

有人对这种意外和奇怪的行为有解释吗?

当将 SortedList 使用的比较器更改为StringComparer.Ordinal(例如通过在上面的示例中更改failfalse)时,问题消失了,这似乎指向一个比较问题,但我不太明白为什么。

已更新 正如 Sébastien 所指出的,此处描述的问题并未出现在 .Net 3.5 和 3.5 客户端配置文件中。它适用于 .Net 4.0、4.0 客户端和 4.5。

经过更多的挖掘,我注意到如果我从列表中获取排序的键并Array.BinarySearch在这些键上运行,它还会为使用SortedList.ContainsKey. 因此,这表明键的排序顺序不正确。

如果我从列表中取出已经排序的键并使用Array.Sort输出的排序顺序对它们进行排序,那么对于有问题的键来说是不同的。

所以我添加了一个函数来检查(使用列表的比较器)给定数组的排序顺序是否正确(即前面的键总是较小,后面的键总是较大)并将输入限制为根据不同的单词比较器。我将此函数应用于 3 个不同的输入(全部使用相同的比较器):

  1. SortedList 的 Keys 集合。
  2. Array.Sort 在这些键上的输出。
  3. Array.Sort 对文件输入的输出。

(2) 和 (3) 的输出与 (1) 相同但不同。但是,在 (2) 和 (3) 的 Array.Sort 输出上再次执行 Array.BinarySearch 无法找到相同的键(返回 < 0)。此外,检查正确排序顺序的功能表明,对于所有 3 种情况,所涉及的有问题键的排序顺序都不正确。

在这一点上,我只是希望我做了一些非常愚蠢的事情,并且有一个简单的解释。希望有人可以向我指出这一点。

示例代码通过我的其他故障排除实验进行了更新,输出的屏幕截图可以在这里找到http://imgur.com/DU8SCsA

更新 2 好的,我已将问题缩小到对我来说似乎是从 .Net 4.0 开始引入的 c# 字符串比较器的一个非常严重的问题。

总之,假设我们有 3 个值:a1、a2 和 a3。为了使任何类型的排序正常工作,我们希望 ifa1 < a2a2 < a3that 为了比较一致,因此以下也成立a1 < a3

然而,c# 字符串比较器并非如此(至少对于Comparer<string>.Defaultand而言StringComparer.InvariantCulture)。

下面的小程序说明了这个确切的问题:

这是它的输出:

结论似乎是依赖使用 c# 字符串比较器确定的排序顺序是不安全的,还是我遗漏了什么?

更新 3 这个问题似乎已于 2012 年 12 月向 MS 报告,并以“不会修复”状态关闭,这相当令人失望;请参阅下面评论中发布的链接(由于我的声誉点有限,我似乎无法在此处发布)。这还列出了一个解决方法,我已经实现并使用它来验证这确实解决了使用标准比较器观察到的问题。

这种解决方法的问题在于,它对于相当大的集合几乎不实用,因为它比 eg 慢一个数量级StringComparer.InvariantCulture

使用两个比较器对给定单词列表进行 1000 次排序所花费的时间:

所以我仍然希望微软重新考虑或有人知道一个可行的替代方案。否则,剩下的唯一选择就是重新使用StringComparer.Ordinal.

0 投票
9 回答
7290 浏览

c# - 在C#中查找两个字符串之间相互的字符数

我正在寻找一种方法,该方法将采用两个字符串并返回两者共有的字符数,例如:

“G010”和“G1820A”应该返回 3,因为 G、0 和 1 字符都存在于两者中。

如果一个 char 在两者中都存在两次,则应分别计算如下:

"G12AA" & "GAA2" 应该返回 4,因为 G、A、A 和 2 字符都存在。

有什么帮助吗?到目前为止,谷歌搜索并没有太大帮助。

0 投票
4 回答
1812 浏览

sorting - 带有下划线的Powershell排序字符串

以下列表未正确排序(恕我直言):

我方便的 ASCII 图表和 Unicode C0 控件和基本拉丁图表有下划线(低线),序数为 95 (U+005F)。这是一个高于大写字母 AZ 的数字。排序应该将以下划线结尾的字符串放在最后。

Get-Culture is en-US

下一组命令符合我的预期:

现在我创建一个包含相同 3 个字符串的 ANSI 编码文件:

再一次,包含下划线/下划线的字符串没有正确排序。我错过了什么?


编辑:

让我们参考这个例子#4:

似乎两个陈述都应该是 False 或者两者都应该是 True。我在第一个语句中比较字符串,然后比较 Char 类型。字符串只是 Char 类型的集合,所以我认为这两个比较操作应该是等价的。

现在例如#5:

这两个 ArrayList 包含相同的字符串,但排序方式不同。为什么?

0 投票
3 回答
667 浏览

vb.net - 如何比较两个字符串的准确性

我正在制作这个无用的程序只是为了正确地重新编程,并且我正在努力比较两个字符串的准确性。


我基本上有2个字符串:(示例)

(我比较的常数)str1 =“abcdefghijkl”

(输入)str2 = "abcdefghjkli"

str2 在(包括)“h”之前是正确的。我想知道字符串的正确百分比。

这是我到目前为止的代码:

结束功能 两个注释部分是我来这里之前尝试的另一种方法。代码应该如下运行

compareString("abcdefghijkl", "abcdefghjkli")

strNum 将达到 8。

百分比匹配 = ((8 / 12)*100)

*百分比匹配 = 75

返回 75

但是,它不返回这个,在线

它返回一个错误,“索引超出了数组的范围。” 我理解错误,只是不知道我哪里出错了。

如果还有我可以提供的信息,我会在看到通知后立即提供:)

提前致谢,

林斯莱普

0 投票
2 回答
4494 浏览

c# - 字符串与C#中的特殊字符比较

我有两个字符串“ CZSczs”-“ ČŽŠčžš”,我想在比较字符串时返回 true。我尝试了字符串比较,但它不起作用。