【问题标题】:How to use the StringComparison in c# (CA1307)?如何在 c# (CA1307) 中使用 StringComparison?
【发布时间】:2017-05-05 05:29:30
【问题描述】:

我的目标是省略 author_namepipeline 开头和 author_emailpipeline@gmail.com 开头的数据strong> 如果项目名称以 ej2Ej2 开头。

我有以下代码。这段代码完全符合我的预期。

if ((author_name != "pipeline" && author_email != "pipeline@gmail.com") && 
    (projectName.StartsWith("ej2") == false || projectName.StartsWith("Ej2") == false))
{
  // some operations
}

我的 FxCop 说下面的违规使用上面的方法。

严重性代码描述项目文件行抑制状态 警告 CA1307 因为 'string.StartsWith(string)' 的行为可能会因当前用户的区域设置而异,所以将 'GetProjectDetailsByApi.DevelopmentBranchStatus(List)' 中的调用替换为对 'string.开始(字符串,字符串比较)'。如果将向用户显示“string.StartsWith(string, StringComparison)”的结果,例如在对列表框中显示的项目列表进行排序时,指定“StringComparison.CurrentCulture”或“StringComparison.CurrentCultureIgnoreCase”作为“字符串比较”参数。如果比较不区分大小写的标识符,例如文件路径、环境变量或注册表项和值,请指定“StringComparison.OrdinalIgnoreCase”。否则,如果比较区分大小写的标识符,请指定“StringComparison.Ordinal”。

所以我改变了我的代码,如下所示。但我只有

if (author_name.Equals("pipeline", StringComparison.OrdinalIgnoreCase) == false
    && author_email.Equals("pipeline@gmail.com", StringComparison.OrdinalIgnoreCase) == false 
    && projectName.StartsWith("ej2", StringComparison.OrdinalIgnoreCase) == false)
{
   //mY code
}

但上面的代码过滤了所有 ej2 项目。但我只想过滤具有 author_nameauthor_email 的项目是 pipelinepipeline@gmail.com分别。

如果我更改条件projectName.StartsWith("ej2", StringComparison.OrdinalIgnoreCase) == **true** 意味着,它只给出仅启动ej2的项目。

我该怎么做?

【问题讨论】:

    标签: c# visual-studio-2015 string-comparison fxcop


    【解决方案1】:

    仅在Ej2或ej2开头的项目中省略author_name = pipeline和author_email = pipeline@gmail.com的数据

    试试这个:

    if(!author_name.Equals("pipeline",StringComparison.InvariantCultureIgnoreCase) && !author_email.Equals("pipeline@gmail.com ",StringComparison.InvariantCultureIgnoreCase))
    {
        if(projectName.StartsWith("Ej2", StringComparison.InvariantCultureIgnoreCase))
        {
            // do Your Operations
        }
    }
    

    【讨论】:

    • 也可以使用StringComparison.OrdinalIgnoreCase
    【解决方案2】:

    如果我对您的理解正确,问题是您正在对一个字符串 (ej2) 进行不区分大小写的比较,而不是对两个字符串 (ej2Ej2) 您想要过滤的内容(至少这是我从您的第一个条件到第二个条件的变化)。

    这样的东西看起来像是原始条件的 FxCop 安全版本(注意:我使用“not”运算符 (!) 而不是 == false 来节省一些输入):

    if (!author_name.Equals("pipeline", StringComparison.OrdinalIgnoreCase)
        && !author_email.Equals("pipeline@gmail.com", StringComparison.OrdinalIgnoreCase)
        && !projectName.StartsWith("ej2", StringComparison.Ordinal) 
        && !projectName.StartsWith("Ej2", StringComparison.Ordinal))
    {
       // do something here...
    }
    

    【讨论】:

    • 感谢您的回复。但是这个条件过滤了所有以 ej2 开头的项目。但是我需要像如果项目名称以 ej2 或 Ej2 开头并且 author_name 是 pipeline 而 author_email 是 pipeline@gmail.com 表示我不需要这些数据。
    • 我的意思是,我需要省略只有在项目中以 Ej2 或 ej2 开头的 author_name = pipeline 和 author_email = pipeline@gmail.com 的数据
    • 我的回答中的这个条件(是)你所说的原始条件的复制品,除了它添加了StringComparison 部分。但是,我已更新代码以将 || 更改为 &&。原因是,对于所有项目,最后两个条件(组合在一起)将始终评估为 true。如果项目名称是"ej2",那么对"Ej2" 的第二次检查将为真。由于false || true == true,那么无论名称如何,最后一组条件都没有做任何事情。我唯一的问题是,你展示的第一个怎么可能是你想做的?
    【解决方案3】:

    包起来

    #pragma warning disable CA1307 // Specify StringComparison

    #pragma warning restore CA1307 // Specify StringComparison

    【讨论】:

    • 谢谢,我一直在寻找这个,因为我无法在 Linq to Entity 中使用 StringComparisson
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2012-03-14
    • 1970-01-01
    • 2019-08-25
    相关资源
    最近更新 更多