在机器对机器通信场景中使用的正确字符串比较值是啥?
Posted
技术标签:
【中文标题】在机器对机器通信场景中使用的正确字符串比较值是啥?【英文标题】:What is the right string comparison value to be used in a machine to machine communication scenario?在机器对机器通信场景中使用的正确字符串比较值是什么? 【发布时间】:2020-08-26 22:19:09 【问题描述】:考虑一个场景,您正在实现旨在用于机器对机器通信的代码。典型的例子是在 Web API 操作方法中执行的代码。
假设你想在字符串之间进行精确匹配;也许你有一个用户列表,你想找到一个提供用户名的特定用户:
List<User> users = ....
const string username = "user-123";
var user = users.Find(u => string.Equals(username, u.UserName));
在这种情况下我应该使用StringComparison.Ordinal
还是StringComparison.InvariantCulture
?
根据我的理解,由于我想在两个字符串之间执行完全匹配,所以这里的正确选择是StringComparison.Ordinal
。
两个字符串Straße
和strasse
之间的文化敏感比较 的典型示例(由于语言规则,这两个字符串被认为是相等的)似乎不适合这里。
这个假设正确吗?
如果这是正确的,您能否提供一个使用不变文化的示例 而不是序数比较是正确的选择?
澄清一下,我之所以这么问,是因为我正在开发一个代码库,其中有大量使用不变文化的字符串比较。其中许多案例涉及在机器对机器通信场景中执行的精确字符串匹配。所以我想确保清楚地理解正确选择字符串比较值背后的基本原理。
【问题讨论】:
【参考方案1】:从提供的详细信息看来,您的假设是正确的 - 您希望找到名称为“Bob”的特定用户。 “Bób” 是不同的用户,不应匹配,即您实际上是在尝试匹配两个符号,而不是用户名的读取方式。
但是,如果您正在查找街道名称,您可能希望要求代码将“strasse”和“Straße”视为相同,因为您正在进行语言匹配,即客户是否会阅读这些两件事以同样的方式。
【讨论】:
所以重点是您正在执行的比较的语义。如果您将两个字符串视为字节序列(符号,如上所述),则要进行的比较是序数比较。反之亦然,如果您认为这两个字符串具有语言含义,则必须执行文化敏感比较。正确吗? 所以下一个自然问题如下:在哪些情况下,我应该更喜欢不变的文化(基本上是基于英语的文化)而不是更具体的文化,例如 en-gb 文化? 对我来说听起来像是一个单独的问题:) 我针对不变的文化用法发布了一个单独的问题 (***.com/questions/61740030/…)以上是关于在机器对机器通信场景中使用的正确字符串比较值是啥?的主要内容,如果未能解决你的问题,请参考以下文章