C# 是否有StringComparison.InvariantCultureIgnoreCase的快捷方式?
在进行大量不区分大小写的字符串比较后,我最后给出了大量冗长的语句,如:C# 是否有StringComparison.InvariantCultureIgnoreCase的快捷方式?,c#,.net,string,string-comparison,C#,.net,String,String Comparison,在进行大量不区分大小写的字符串比较后,我最后给出了大量冗长的语句,如: myList.FirstOrDefault( c => string.Equals( c.InternalName, internalName, StringComparison.InvariantCultureIgnoreCase)); 困扰我的是StringComparison.InvariantCultureIgnoreC
myList.FirstOrDefault(
c => string.Equals(
c.InternalName,
internalName,
StringComparison.InvariantCultureIgnoreCase));
困扰我的是StringComparison.InvariantCultureIgnoreCase
的长名称
我可以考虑使用扩展方法之类的方法来缩短我必须编写的代码,但另一方面,我担心会“混淆”我的代码,从而使代码更难理解
所以我的问题是:
是否有一种“最佳实践”,即必须编写更少的文本,但仍要进行不变量文化识别代码样式的字符串比较?您可以:
myList.FirstOrDefault(
c => string.Equals(
c.InternalName,
internalName,
(StringComparison)3);
无论如何。。。我认为你不应该担心这种事情
编辑:
如果你想让它很短,你可以这样做:
using System;
using System.Collections.Generic;
using System.Linq;
using s = System.String;
using sc = System.StringComparison;
using l = System.Collections.Generic.List<Test.Test.c>;
namespace Test
{
class Test
{
private sc cic = sc.InvariantCultureIgnoreCase;
public class c
{
public s i;
}
private void Test(s i)
{
l ml = new l();
ml.FirstOrDefault(
c => s.Equals(
c.i,
i,
cic));
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用s=System.String;
使用sc=System.StringComparison;
使用l=System.Collections.Generic.List;
名称空间测试
{
课堂测试
{
私有sc-cic=sc.InvariantCultureIgnoreCase;
公共c类
{
公共服务一级;
}
私人无效测试(s i)
{
l ml=新的l();
第一默认值(
c=>s.等于(
c、 我,,
我
中投),;
}
}
}
:-)您可以用扩展方法将其包装起来
:
public static class StringExtensions
{
public static bool EqualsCaseInsensitive(this string str, string other)
{
return string.Equals(str, other, StringComparison.InvariantCultureIgnoreCase);
}
}
然后做:
myList.FirstOrDefault(
c => c.InternalName.EqualsCaseInsensitive(internalName))
您始终可以将其指定给常数:
public const StringComparison IGNORE_CASE= StringComparison.InvariantCultureIgnoreCase; //use whatever name you like
并将其放置在可以从您需要的任何位置引用的位置…(如果您需要在多个项目中使用它,则可将其放置在“实用程序”dll中)
现在您可以使用它而不是大枚举
myList.FirstOrDefault(
c => string.Equals(
c.InternalName,
internalName,
IGNORE_CASE));
不知道框架中有什么捷径。如果您发现自己在重复任何代码,您应该创建一个函数。如果静态函数在许多地方都很有用,那么将其移动到util类:
myList.FirstOrDefault(
c => Are.SameIgnoringCase(
c.InternalName,
internalName));
public static class Are {
public boolean SameIgnoringCase(string a, string b)
{
return string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
}
}
我给这个类起了一个相当隐晦的名字,但它产生了可读性很好的代码
我已经包含了一个如下的更改,因为您可能不需要不变的比较。另请参见:侧点,您是否知道顺序比较和不变比较之间的区别:以及Microsoft的建议:@weston谢谢。似乎我应该使用OrdinalIgnoreCase
来代替(这也有点短!)。我使用的是一个扩展方法,它工作得很好,我不认为它会混淆我的代码。我的队友使用它也很舒服。即EqualsIgnoreCase
Why 3个参数?如何使用它?不是StringComparer
,而是stringcomparation
。这隐藏了一个事实,即它使用的是不变量区域性,与其他所有字符串方法不同。谢谢,很抱歉为它担心。谢谢!可能是唯一的出路。