Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重写C中两个字符串的常规比较_C#_String_String Comparison - Fatal编程技术网

C# 如何重写C中两个字符串的常规比较

C# 如何重写C中两个字符串的常规比较,c#,string,string-comparison,C#,String,String Comparison,我有一个类似下面链接的问题,但要复杂得多: 我有一本字典,里面有一些值,比如: {[Ministère de l'économie, 139]} {[Ministère des finances, 114]} 为了向字典中插入新元素,正如sames代码一样,我写了以下内容: if (!dict.ContainsKey(str)) { dict.Add(str, Convert.ToDouble(number)); } 但当我想检查这个值是否存在时: {[Ministère de l'ec

我有一个类似下面链接的问题,但要复杂得多:

我有一本字典,里面有一些值,比如:

{[Ministère de l'économie, 139]}
{[Ministère des finances, 114]}
为了向字典中插入新元素,正如sames代码一样,我写了以下内容:

if (!dict.ContainsKey(str))
{  dict.Add(str, Convert.ToDouble(number)); }
但当我想检查这个值是否存在时: {[Ministère de l'economie,139]}它返回它不存在的结果

如何对代码实现此响应

string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace); 
另一方面,作为我问题的标题,如何覆盖应用程序中的常规或主要字符串比较方法?

因此,结合,您可以制作一个IEqualityComparer,以提供给您的词典:

public class IgnoreAccentsAndDiacriticsComparer:IEqualityComparer<string>
{
    public bool Equals(string left, string right)
    {
        if(left == null && right == null){ return true; }
        if(left == null || right == null){ return false; }
        return string.Equals(RemoveDiacritics(left), RemoveDiacritics(right));
    }

    public int GetHashCode(string txt)
    {
        return RemoveDiacritics(txt).GetHashCode();
    }

    static string RemoveDiacritics(string text)
    {
        string formD = text.Normalize(NormalizationForm.FormD);
        StringBuilder sb = new StringBuilder();

        foreach (char ch in formD)
        {
            UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
            if (uc != UnicodeCategory.NonSpacingMark)
            {
                sb.Append(ch);
            }
        }

        return sb.ToString().Normalize(NormalizationForm.FormC);
    }
}
…然后把它读出来,不带口音:

Console.WriteLine(myDic["Aimee"]); //ŵôõ!
因此,结合,您可以制作一个IEqualityComparer,以提供给您的词典:

public class IgnoreAccentsAndDiacriticsComparer:IEqualityComparer<string>
{
    public bool Equals(string left, string right)
    {
        if(left == null && right == null){ return true; }
        if(left == null || right == null){ return false; }
        return string.Equals(RemoveDiacritics(left), RemoveDiacritics(right));
    }

    public int GetHashCode(string txt)
    {
        return RemoveDiacritics(txt).GetHashCode();
    }

    static string RemoveDiacritics(string text)
    {
        string formD = text.Normalize(NormalizationForm.FormD);
        StringBuilder sb = new StringBuilder();

        foreach (char ch in formD)
        {
            UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
            if (uc != UnicodeCategory.NonSpacingMark)
            {
                sb.Append(ch);
            }
        }

        return sb.ToString().Normalize(NormalizationForm.FormC);
    }
}
…然后把它读出来,不带口音:

Console.WriteLine(myDic["Aimee"]); //ŵôõ!

从.NET 4.6开始,CompareInfo有一些有趣的重载,因此中建议的第一个解决方案可以在IEqualityComparer中使用:

然后

var myDic = new Dictionary<string, int>(var myDic = new Dictionary<string, int>(new IgnoreAccentsAndDiacriticsComparer()).CurrentCulture);

从.NET 4.6开始,CompareInfo有一些有趣的重载,因此中建议的第一个解决方案可以在IEqualityComparer中使用:

然后

var myDic = new Dictionary<string, int>(var myDic = new Dictionary<string, int>(new IgnoreAccentsAndDiacriticsComparer()).CurrentCulture);

您需要实现一个IEqualityComparer并将其提供给。在比较器中,您将有机会定义什么等于什么。除了重新定义字符串类之外,您不能重写字符串方法。在您的情况下,我建议使用此方法:然后比较OK,感谢您的详细解释。您需要实现一个IEqualityComparer并将其提供给。在比较器中,您将有机会定义什么等于什么。除了重新定义字符串类之外,您不能重写字符串方法。在您的情况下,我建议使用这种方法:然后比较OK,谢谢您的详细解释。