在项目中经常会用到字符串比较,但是有时候对字符串的操作比较多,规则各异。
比如有的地方我们需要用排序规则,有的地方需要忽略大小写,我们该如何写一个比较容易操作的比较方法呢?
重新实现IComparer接口不失为一个好办法。
我们可以在实现Compare方法的时候指定比较规则CompareOptions
| 成员名称 | 说明 |
| IgnoreCase | 指示字符串比较必须忽略大小写。 |
| IgnoreKanaType | 指示字符串比较必须忽略 Kana 类型。假名类型是指日语平假名和片假名字符,它们表示日语中的语音。平假名用于表示日语自有的短语和字词,而片假名用于表示从其他语言借用的字词,如“computer”或“Internet”。语音既可以用平假名也可以用片假名表示。如果选择该值,则认为一个语音的平假名字符等于同一语音的片假名字符。 |
| IgnoreNonSpace | 指示字符串比较必须忽略不占空间的组合字符,比如音调符号。Unicode 标准将组合字符定义为与基字符组合起来产生新字符的字符。不占空间的组合字符在呈现时其本身不占用空间位置。有关不占空间的组合字符的更多信息,请参见 http://www.unicode.org 中的“The Unicode Standard”(Unicode 标准)。 |
| IgnoreSymbols | 指示字符串比较必须忽略符号,如空白字符、标点符号、货币符号、百分号、数学符号、“&”符等等。 |
| IgnoreWidth | 指示字符串比较必须忽略字符宽度。例如,日语片假名字符可以写为全角或半角形式;如果选择该值,则认为写为全角形式的片假名字符等于写为半角形式的同一字符。 |
| None | 指定字符串比较的默认选项设置。 |
| Ordinal | 指示必须使用每个字符的 Unicode 值进行字符串比较;这是一种快速比较方式,但是不区分区域性。如果 xxxx 小于 yyyy,则以“U+xxxx”开头的字符串位于以“U+yyyy”开头的字符串之前。此标志不能和其他标志组合使用,必须单独使用。 |
| OrdinalIgnoreCase | 指示字符串比较必须忽略大小写,然后执行序号比较。这等效于使用固定区域性将字符串转换成大写,然后对结果执行序号比较。 |
| StringSort | 指示字符串比较必须使用字符串排序算法;在这种算法中,连字符和省字号以及其他非字母数字字符均位于字母数字符号前。 |
我们默认使用string.CompareTo方法的时候,使用的是None(默认比较规则,排序顺序)
public class MyStringComparer : IComparer
{
private CompareInfo myComp = CultureInfo.InvariantCulture.CompareInfo;
public CompareOptions myOptions = CompareOptions.None;//默认按照字符串比较
public MyStringComparer()
{
myComp = CompareInfo.GetCompareInfo("en-US");
}
public MyStringComparer(CompareOptions options)
{
this.myOptions = options;
}
public int Compare(object x, object y)
{
if (x == y) return 0;
if (x == null) return -1;
if (y == null) return 1;
String sa = x as String;
String sb = y as String;
if (sa != null && sb != null)
return myComp.Compare(sa, sb, myOptions);
throw new ArgumentException("x and y should be strings.");
}
在实现接口的过程中有2个比较重要的对象,
CompareInfo : 实现一组方法进行区分区域性的字符串比较CompareOptions :指定用于 CompareInfo的比较规则
调用时只要指定不同的CompareOptions就可以得到不同的结果:
MyStringComparer mc = new MyStringComparer(CompareOptions.None);
int y = mc.Compare(a, b);//y=-1
mc.myOptions = CompareOptions.IgnoreCase;
int z = mc.Compare(a, b);//z=0
详情参阅MSDN文档:
String.CompareTo 方法 (String)
本文介绍了一种通过实现IComparer接口并利用CompareOptions参数来自定义字符串比较规则的方法,提供了灵活的字符串比较解决方案。
2751

被折叠的 条评论
为什么被折叠?



