Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何修复跨机器的字符串比较 我有本地机器,其语言环境为:en US 我已经用locale构建了机器:en US POSIX 我有prod(AWS dotnet lambda)机器,其语言环境为:en_US.UTF-8_C#_.net Core_Locale_String Comparison - Fatal编程技术网

C# 如何修复跨机器的字符串比较 我有本地机器,其语言环境为:en US 我已经用locale构建了机器:en US POSIX 我有prod(AWS dotnet lambda)机器,其语言环境为:en_US.UTF-8

C# 如何修复跨机器的字符串比较 我有本地机器,其语言环境为:en US 我已经用locale构建了机器:en US POSIX 我有prod(AWS dotnet lambda)机器,其语言环境为:en_US.UTF-8,c#,.net-core,locale,string-comparison,C#,.net Core,Locale,String Comparison,我有一段代码可以为数据库字段获得适当的大小写: public string FixFieldCaseName(string fieldName) { var mappings = new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase); mappings.Add("test", "Test"); if (mappings.TryGetValue(fieldName, ou

我有一段代码可以为数据库字段获得适当的大小写:

public string FixFieldCaseName(string fieldName)
{
    var mappings = new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase);
    mappings.Add("test", "Test");

    if (mappings.TryGetValue(fieldName, out var fixedFieldName) && fixedFieldName != fieldName)
    {
        _logger.Debug("stuff");
        return fixedFieldName;
    }
    return fieldName;
}
公共字符串FixFieldCaseName(字符串字段名)
{
var映射=新字典(StringComparer.CurrentCultureInoRecase);
添加(“测试”、“测试”);
if(mappings.TryGetValue(fieldName,out var fixedFieldName)&&fixedFieldName!=fieldName)
{
_调试(“东西”);
返回fixedFieldName;
}
返回字段名;
}
这可以在本地和lambda上工作,但不能在构建机器上工作。它返回原始字符串

本地和Lambda:输入(“测试”)->输出(“测试”)

构建机:输入(“测试”)->输出(“测试”)

由于语言环境(en US POSIX),它在Ubuntu上不起作用:

字段名用于在数据库中执行查询

解决这个问题的正确方法是什么

  • 我不确定是使用OrdinalIgnoreCase还是InvariantCultureIgnoreCase,即使在我重新阅读了MSFT页面上的最佳实践之后
  • 我应该在我的代码中到处设置文化吗
  • System.Globalization.CultureInfo.CurrentCulture=new System.Globalization.CultureInfo(“en-US”)


    感谢您的帮助。

    要使用的区域性是根据字符串的用途确定的。基于方法名
    FixFieldCaseName()
    ,是否有可能在序列化和/或反射期间使用此方法按字段名访问数据?查看何时使用每一个的指导信息。@dbc字符串用于在postgres DB中执行查询。如果它们是字段名,那么您可能希望在所有计算机、区域性和平台上生成相同的查询。如果是这样,请使用
    ordinallingorecase
    。但是如果传入的
    字段名是用户键入的内容,则可能需要使用
    CurrentCultureIgnoreCase
    。例如,在土耳其语中,
    i
    的大写字母是
    İ
    (大写虚线i),请参见。对于土耳其用户,您希望
    i
    等同于
    i
    还是
    İ
    。我们不会有非英语的字段名。但即使我们有土耳其字段,由于古怪的POSIX语言环境,CurrentCultureInoRecase在构建机器上也不起作用。