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()
检查子字符串,其中asequals()
检查整个字符串,其他区别是,contains()
接受CharSequence类的对象,其中asequals()
接受对象作为其参数
他们之间有什么不同
包含
和等于
都使用字符串比较。由于键
是字符串类型,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;
}