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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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#_Asp.net_Vb.net - Fatal编程技术网

C# 忽略不区分大小写的字典键中的连字符

C# 忽略不区分大小写的字典键中的连字符,c#,asp.net,vb.net,C#,Asp.net,Vb.net,我在asp.net/vb.net中有一个不区分大小写的字典,如下所示: Dim caseInsensitiveDictionary = New Dictionary(Of String, Single)(StringComparer.OrdinalIgnoreCase) Response.Write(dictionary("ONE-hundred").ToString) public class MyEqualityComparer : IEqualityComparer<string

我在asp.net/vb.net中有一个不区分大小写的字典,如下所示:

Dim caseInsensitiveDictionary = New Dictionary(Of String, Single)(StringComparer.OrdinalIgnoreCase)
Response.Write(dictionary("ONE-hundred").ToString)
public class MyEqualityComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return FixString(x).Equals(FixString(y), StringComparison.InvariantCultureIgnoreCase);
    }

    private string FixString(string x)
    {
        // replace hyphens
        return x.Replace("-", " ");
    }

    public int GetHashCode(string obj)
    {
        return FixString(obj).GetHashCode();
    }
}
它持有这样的价值观

one hundred, 100
one hundred one, 101
one hundred two, 102
我希望,如果用户试图找到如下值:

Dim caseInsensitiveDictionary = New Dictionary(Of String, Single)(StringComparer.OrdinalIgnoreCase)
Response.Write(dictionary("ONE-hundred").ToString)
public class MyEqualityComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return FixString(x).Equals(FixString(y), StringComparison.InvariantCultureIgnoreCase);
    }

    private string FixString(string x)
    {
        // replace hyphens
        return x.Replace("-", " ");
    }

    public int GetHashCode(string obj)
    {
        return FixString(obj).GetHashCode();
    }
}
他得到100,但现在它得到了例外,因为字典键没有连字符“-”。我需要覆盖哪个方法


请建议您必须创建一个自定义的IEqualityComparer

大概是这样的:

Dim caseInsensitiveDictionary = New Dictionary(Of String, Single)(StringComparer.OrdinalIgnoreCase)
Response.Write(dictionary("ONE-hundred").ToString)
public class MyEqualityComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return FixString(x).Equals(FixString(y), StringComparison.InvariantCultureIgnoreCase);
    }

    private string FixString(string x)
    {
        // replace hyphens
        return x.Replace("-", " ");
    }

    public int GetHashCode(string obj)
    {
        return FixString(obj).GetHashCode();
    }
}
公共类MyEqualityComparer:IEqualityComparer
{
公共布尔等于(字符串x、字符串y)
{
返回FixString(x).Equals(FixString(y),StringComparison.InvariantCultureIgnoreCase);
}
私有字符串固定字符串(字符串x)
{
//替换连字符
返回x.Replace(“-”,”);
}
public int GetHashCode(字符串obj)
{
返回FixString(obj).GetHashCode();
}
}
然后在字典中使用该类:
Dictionary x=new Dictionary(new MyEqualityComparer())

您可以将
100100
以及添加到字典(最简单的方法)或构建自定义
StringComparer

Class CaseInsensitiveIgnoringStringComparer
    Inherits StringComparer
    Private caseInsentiveComparer As System.StringComparer = StringComparer.OrdinalIgnoreCase
    Public Property IgnoreList As IList(Of String) = Nothing
    Public Property ReplaceWith As String = " "

    Private Function Replace(original As String) As String
        If IgnoreList Is Nothing OrElse IgnoreList.Count = 0 Then
            Return original
        Else
            For Each s As String In IgnoreList
                original = original.Replace(s, ReplaceWith)
            Next
            Return original
        End If
    End Function

    Public Overloads Overrides Function Compare(x As String, y As String) As Integer
        Return caseInsentiveComparer.Compare(Replace(x), Replace(y))
    End Function

    Public Overloads Overrides Function Equals(x As String, y As String) As Boolean
        Return caseInsentiveComparer.Equals(Replace(x), Replace(y))
    End Function

    Public Overloads Overrides Function GetHashCode(obj As String) As Integer
        Return caseInsentiveComparer.GetHashCode(Replace(obj))
    End Function
End Class
测试

Dim comp = New CaseInsensitiveIgnoringStringComparer() With {.IgnoreList = {"-", "+"}, .ReplaceWith = " "}
Dim caseInsensitiveDictionary = New Dictionary(Of String, Single)(comp)
caseInsensitiveDictionary.Add("One hundred", 100)
caseInsensitiveDictionary.Add("One hundred one", 101)
caseInsensitiveDictionary.Add("One hundred two", 102)

' normally following both lines would cause exceptions '
Dim n100 = caseInsensitiveDictionary("ONE-hundred")
n100 = caseInsensitiveDictionary("oNE+Hundred")

你为什么不简单地加上100个呢?这是否意味着我需要为每个数字加上两个键?一百换一百?一百换四把钥匙(或者一百零一、一百零一、一百零一……(实际上最后一把有点长)和我要说的差不多,但是将
InvariantCultureIgnoreCase
更改为
ordinarignionorecase
@Rawling InvariantCultureIgnoreCase和OrdinalIgoneCase之间的区别是什么?@DotnetSparrow我之所以做出这样的评论,是因为您在自己的代码中使用了
Ordinal
而不是
InvariantCulture
,我不是100%确定这一区别我自己。好的,谢谢。我在以下位置收到声明预期错误:IEqualityComparerRight,应替换为“”。道格拉斯已经修好了。谢谢。我对另一个答案投了更高的票,因为它没有重复
.Replace(“-”,”)
代码,即使VB答案对VB问题更有意义。@Douglas:另一个答案不起作用,因为它用空字符串代替了空格。好的观点,修复了。(因为是干的,所以只在一行上进行了修复,)