C# 包含和相等(=)之间的差异

C# 包含和相等(=)之间的差异,c#,dictionary,C#,Dictionary,我有一本字典 public Dictionary<string, bool> SearchType { get; set; } 在这里,我从下面的代码中检查了密钥是CKBinstituteType或CKBstate等 foreach (var searchType in searchTypes) { if (searchType.Key.Contains("CKBinstituteType")) { } if (searchType.Key.Co

我有一本字典

 public Dictionary<string, bool> SearchType { get; set; }
在这里,我从下面的代码中检查了密钥是CKBinstituteType或CKBstate等

foreach (var searchType in searchTypes)
{
    if (searchType.Key.Contains("CKBinstituteType"))
    {

    }
    if (searchType.Key.Contains("CKBstate"))
    {

    }
    if (searchType.Key.Contains("CKBlocation"))
    {

    }
    if (searchType.Key.Contains("CKBdistance"))
    {

    }
 }
或者用这种方法尝试(使用相等操作而不是包含)

它们之间有什么区别?哪一个对我的处境有利?(如性能、代码标准等)

contains()
检查子字符串,其中as
equals()
检查整个字符串,其他区别是,
contains()
接受CharSequence类的对象,其中as
equals()
接受对象作为其参数

他们之间有什么不同

包含
等于
都使用字符串比较。由于
是字符串类型,
Contains
将检查传递的参数是否是键的一部分,而
Equals
将比较完整的字符串是否相等

哪一个对我的处境有利?(例如性能、代码) 标准等)

使用方法,而不是字符串equals或contains。 Contains和Equals在
foreach
循环中使用,在该循环中,您将
Contains
Equals进行比较,键是
字符串
。您不需要迭代字典中的每个项目。如果您试图通过键访问它,那么它是关于执行复杂度为
O(n)
的线性搜索,而不是执行复杂度为
O(1)

您可以像这样使用
ContainsKey

if (SearchType.ContainsKey("CKBinstituteType"))
{
}
目前您正在将词典转换为列表,我不确定是否真的需要将词典转换为列表,然后进行线性搜索。如果确实需要根据
true
值筛选出字典,则将结果集投影到字典中,然后使用
ContainsKey
如下:

var searchTypes = searchDetail.SearchType.Where(r => r.Value == true)
                            .ToDictionary(r => r.Key, r => r.Value);
if (searchTypes.ContainsKey("CKBinstituteType"))
{

}
if (searchTypes.ContainsKey("CKBstate"))
{

}
if (searchTypes.ContainsKey("CKBlocation"))
{


}
if (searchTypes.ContainsKey("CKBdistance"))
{

}
区别在于

stringExpr.Contains("CKBinstituteType")
检查是否有
stringExpr
的某些子字符串等于
“CKBinstituteType”
,而

stringExpr == "CKBinstituteType"
检查
stringExpr
本身是否等于
“CKBinstituteType”

在这两种情况下,都使用顺序比较(这是区域性不变的)。作为一个明确的例子

"xyzxyzCKBinstituteTypexyzxyzxyz".Contains("CKBinstituteType")
true
while

"xyzxyzCKBinstituteTypexyzxyzxyz" == "CKBinstituteType"
false



性能:
stringExpr.Contains(“CKBinstituteType”)
将比
stringExpr==“CKBinstituteType”
慢。请注意,我并不是要说明这些字符串是
字典中的键这一事实。见哈比卜的答案。
字典
提供对键的快速(O(1))查找。当您执行dict.Where(x=>criteria).ToList()时,您不会使用该选项,只考虑在等效字符串上使用Compare或Equals是否有任何区别:

使用ReSharper查看源代码进行比较,它要做的第一件事是

if ((Object)strA == (Object)strB) 
{ 
    return 0;
} 
因此,对于等价字符串,它们看起来基本相同


就性能而言,讨论了差异,尽管评论中包含了最有用的比较。大多数评论员似乎发现,即使在非常大的循环中运行它们,它们之间的差异也可以忽略不计。不过,最后一条注释显示了Equals和Contains之间的巨大差异,让我想知道为什么结果没有更紧密地反映其他结果。

现在您可以决定要使用哪一条。如果value参数出现在该字符串中,或者value是空字符串(“”),则为true;否则,false.Yeap这是最好的选择。@user256103,我相信您正在尝试在循环中使用它,不需要对字典执行线性搜索,相反,在字典中搜索密钥
SearchTypes
@Habib错误是
'System.Collections.Generic.KeyValuePair'不包含'ContainsKey'的定义,并且找不到接受'System.Collections.Generic.KeyValuePair'类型的第一个参数的扩展方法'ContainsKey'(是否缺少using指令或程序集引用?)
@user256103,为什么要将词典转换为列表?@user256103、
包含
等于
foreach
循环中使用。您不需要迭代词典中的每个项目。如果您试图通过
访问它,则需要执行复杂度为
O的线性搜索(n) 
,而不是复杂地查找字典
O(1)
但是我的密钥不在其他文本中,它是一个常量字符串。那么为什么包含()。但对performance@user256103
“abc”.Contains(“abc”)
仍然为真,因为包含整个字符串的“不正确”子字符串被视为子字符串。
"xyzxyzCKBinstituteTypexyzxyzxyz" == "CKBinstituteType"
if ((Object)strA == (Object)strB) 
{ 
    return 0;
}