代码之家  ›  专栏  ›  技术社区  ›  Brett Ryan

比较char忽略大小写的正确方法是什么?

  •  46
  • Brett Ryan  · 技术社区  · 15 年前

    我想知道比较两个人物的正确方法是什么,忽略所有文化都适用的情况。而且,是 Comparer<char>.Default 测试两个字符而不忽略大小写的最佳方法?这对代理对有效吗?

    编辑 添加样品 IComparer<char> 实施

    如果这对任何人都有帮助,这就是我决定使用的

    public class CaseInsensitiveCharComparer : IComparer<char> {
        private readonly System.Globalization.CultureInfo ci;
        public CaseInsensitiveCharComparer(System.Globalization.CultureInfo ci) {
            this.ci = ci;
        }
        public CaseInsensitiveCharComparer()
            : this(System.Globalization.CultureInfo.CurrentCulture) { }
        public int Compare(char x, char y) {
            return Char.ToUpper(x, ci) - Char.ToUpper(y, ci);
        }
    }
    
    // Prints 3
    Console.WriteLine("This is a test".CountChars('t', new CaseInsensitiveCharComparer()));
    
    8 回复  |  直到 6 年前
        1
  •  78
  •   Jon Skeet    9 年前

    这取决于你所说的“为所有文化工作”。你想让“我”和“我”在土耳其平等吗?

    你可以使用:

    bool equal = char.ToUpperInvariant(x) == char.ToUpperInvariant(y);
    

    …但我不确定你对“作品”的理解是否符合所有的文化。

    当然,您可以将这两个字符都转换为字符串,然后对字符串执行您想要的任何比较。效率稍低,但它确实为您提供了框架中可用的所有比较范围:

    bool equal = x.ToString().Equals(y.ToString(), 
                                     StringComparison.InvariantCultureIgnoreCase);
    

    对于代理项对,a Comparer<char> 无论如何都不可行,因为你没有单人房 char . 你可以创建一个 Comparer<int> 不过。

        2
  •  13
  •   Henk Holterman    15 年前

    使用默认值(即 不变的文化:

    if (char.ToLower(ch1) == char.ToLower(ch2))
    {  ....  }
    

    或指定区域性:

    CultureInfo myCulture = ...;
    if (char.ToLower(ch1, myCulture) == char.ToLower(ch2, myCulture))
    {  ....  }
    
        3
  •  2
  •   Jon Grant    15 年前

    据我所知,没有真正的方法可以“适用于所有文化”。您要比较某种内部的、未显示的字符与用户原因(在这种情况下,应使用InvariantCulture),或者要使用用户的当前区域性。显然,使用用户当前的区域性意味着在不同的区域中会得到不同的结果,但它们将与那些区域中的用户所期望的一致。

    不知道你为什么要比较两个字符,我真的不能告诉你应该使用哪一个。

        4
  •  1
  •   Sergio    15 年前

    string.compare(“string a”,“string a”,true)

    它适用于每根弦

        5
  •  0
  •   ahawker    15 年前

    你可以试试:

        class Test{
        static int Compare(char t, char p){
            return string.Compare(t.ToString(), p.ToString(), StringComparison.CurrentCultureIgnoreCase);
        }
    }
    

    但我怀疑这是“最佳”的方法,但我不是所有你需要检查的案例…

        6
  •  0
  •   Brett Ryan    15 年前

    我想在运行时中可以使用的内容如下

    public class CaseInsensitiveCharComparer : IComparer<char> {
        private readonly System.Globalization.CultureInfo ci;
        public CaseInsensitiveCharComparer(System.Globalization.CultureInfo ci) {
            this.ci = ci;
        }
        public CaseInsensitiveCharComparer()
            : this(System.Globalization.CultureInfo.CurrentCulture) { }
        public int Compare(char x, char y) {
            return Char.ToUpper(x, ci) - Char.ToUpper(y, ci);
        }
    }
    
    // Prints 3
    Console.WriteLine("This is a test".CountChars('t', new CaseInsensitiveCharComparer()));
    
        7
  •  0
  •   David R Tribble    9 年前

    我建议比较大写字母,如果它们不匹配,那么比较小写字母,以防区域设置的大写和小写逻辑行为略有不同。

    补遗

    例如,

    int CompareChar(char c1, char c2)
    {
        int  dif;
    
        dif = char.ToUpper(c1) - char.ToUpper(c2);
        if (diff != 0)
            dif = char.ToLower(c1) - char.ToLower(c2);
        return dif;
    }
    
        8
  •  -1
  •   coder Flo We    6 年前

    您可以为caseinsetive匹配提供最后一个参数为true

    string.Compare(lowerCase, upperCase, true);