如何在 c# (CA1307) 中使用 StringComparison?

Posted

技术标签:

【中文标题】如何在 c# (CA1307) 中使用 StringComparison?【英文标题】:How to use the StringComparison in c# (CA1307)? 【发布时间】: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的项目。

我该怎么做?

【问题讨论】:

【参考方案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

以上是关于如何在 c# (CA1307) 中使用 StringComparison?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 以编程方式在 domino 服务器中获取 CA 配置的验证者名称列表?

如何在 wix 屏幕/对话框之间插入 C# CA 屏幕/表单

C# 如何验证 Root-CA-Cert 证书 (x509) 链?

如何在 C# 中反转文本? [关闭]

如何验证 C# 中的 List 参数以修复 CA1062

使用 C# 从 CA 证书为设备创建 X509 证书