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

时间:2009-09-08 16:13:54

标签: c# .net string comparison char

我想知道比较两个字符的正确方法,忽略了适用于所有文化的案例。另外,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()));

9 个答案:

答案 0 :(得分:78)

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

您可以使用:

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

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

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

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

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

答案 1 :(得分:13)

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

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

或指定文化:

CultureInfo myCulture = ...;
if (char.ToLower(ch1, myCulture) == char.ToLower(ch2, myCulture))
{  ....  }

答案 2 :(得分:2)

据我了解,实际上没有一种方法可以“适用于所有文化”。要么比较某些内部的,不显示给用户的原因(在这种情况下应该使用InvariantCulture),要么要使用用户的CurrentCulture。显然,使用用户当前的文化意味着您将在不同的区域设置中获得不同的结果,但它们将与这些区域设置中的用户所期望的一致。

如果您不想了解更多关于为何比较两个角色的原因,我无法真正建议您应该使用哪一个角色。

答案 3 :(得分:0)

你可以尝试:

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

但我怀疑这是做到这一点的“最佳”方式,但我不是所有需要检查的情况......

答案 4 :(得分:0)

我认为在运行时可用的内容类似于以下内容

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()));

答案 5 :(得分:0)

我建议比较大写,如果它们不匹配则比较小写,以防locale的大写和小写逻辑表现略有不同。

<强>附录

例如,

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;
}

答案 6 :(得分:-1)

string.Compare(“string a”,“STRING A”,true)

它适用于每个字符串

答案 7 :(得分:-1)

我知道这是一篇过时的文章,但是此后一切都变了。

以上问题可以通过使用扩展名来回答。这将扩展char。等于允许局部性和不区分大小写。

在扩展类中,添加以下内容:

internal static Boolean Equals(this Char src, Char ch, StringComparison comp)
{
    Return $"{src}".Equals($"{ch}", comp);
}

我目前正在上班,因此无法检查,但应该可以。

安迪

答案 8 :(得分:-3)

您可以为caseInsensetive匹配

提供最后一个参数为true
string.Compare(lowerCase, upperCase, true);