在机器对机器通信方案中使用的正确字符串比较值是什么?

What is the right string comparison value to be used in a machine to machine communication scenario?

提问人:Enrico Massone 提问时间:5/11/2020 最后编辑:Enrico Massone 更新时间:5/11/2020 访问量:83

问:

请考虑一个方案,其中您正在实现用于机器到机器通信的代码。典型的示例是在 Web API 操作方法中执行的代码。

假设您要在字符串之间执行精确匹配;也许你有一个用户列表,并且你想找到一个提供用户名的特定用户:

List<User> users = ....
const string username = "user-123";
var user = users.Find(u => string.Equals(username, u.UserName));

在这样的场景中,我应该使用还是?StringComparison.OrdinalStringComparison.InvariantCulture

根据我的理解,由于我想在两个字符串之间执行精确匹配,因此此处的正确选择是 .StringComparison.Ordinal

两个字符串 和 之间的区域性敏感比较的典型示例,其中由于语言规则,两个字符串被认为是相等的,似乎不适合这里。Straßestrasse

这个假设正确吗?

如果这是正确的,您能否提供一个使用固定区域性的示例 而不是序数比较是正确的选择吗?

澄清一下,我之所以这么问,是因为我正在开发一个代码库,其中有大量使用固定区域性的字符串比较。其中许多情况是指在机器到机器通信方案中执行的精确字符串匹配。因此,我希望确保清楚地了解正确选择字符串比较值背后的基本原理。

C# 字符串 .net-core string-comparison invariantculture

评论


答:

1赞 Paddy 5/11/2020 #1

从提供的详细信息来看,您的假设似乎是正确的 - 您想找到一个名称为“Bob”的特定用户。“Bób”是不同的用户,不应该匹配,即您实际上是在尝试匹配两个符号,而不是用户名的读取方式。

但是,如果您正在查找街道名称,您可能希望要求代码将“strasse”和“Straße”视为相同,因为您正在进行语言匹配,即客户是否会以相同的方式阅读这两件事。

评论

1赞 Enrico Massone 5/11/2020
所以重点是你正在执行的比较的语义。如果将两个字符串视为字节序列(如上所述,符号),则要进行的比较是有序的。反之亦然,如果您将两个字符串视为具有语言意义的东西,则必须执行文化敏感比较。正确?
0赞 Enrico Massone 5/11/2020
因此,下一个自然的问题是:在哪些情况下,我应该更喜欢不变文化(基本上是基于英语的语言文化)而不是更具体的语言性,例如 en-GB 文化?
1赞 Paddy 5/11/2020
对我来说听起来像是一个单独的问题:)
0赞 Enrico Massone 5/12/2020
我发布了一个单独的问题(stackoverflow.com/questions/61740030/...)关于不变文化的使用