我有一个字典属性
public Dictionary<string, bool> SearchType { get; set; }
此词典有4个键和4个键值。现在我将它们带到SearchType中的变量,如果值为真
var searchTypes = searchDetail.SearchType.Where(x => x.Value == true).ToList();
这里我检查的密钥是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"))
{
}
}
或以这种方式尝试(使用相等的操作而不是包含)
foreach (var searchType in searchTypes)
{
if (searchType.Key == "CKBinstituteType")
{
}
if (searchType.Key == "CKBstate")
{
}
if (searchType.Key == "CKBlocation")
{
}
if (searchType.Key == "CKBdistance")
{
}
}
它们之间有什么区别?哪一个对我的情况有好处? (如性能,代码标准等)
答案 0 :(得分:6)
它们之间有什么不同?
Contains
和Equals
都在使用字符串比较。由于Key
的类型为字符串,Contains
将检查传递的参数是否是键的一部分,而Equals
比较完整的字符串是否相等。
哪一个对我的情况有好处? (比如表现,代码 标准,等)
使用 ContainsKey
方法,而不是字符串equals或contains。
在foreach
循环中使用包含和等于,您将Key
string
与Contains
和Equals
进行比较。您不需要在字典中迭代每个项目。如果您尝试通过Key访问它,那就是执行复杂度为O(n)
的线性搜索,而不是使用复杂性O(1)
执行字典查找
您可以使用ContainsKey
赞
if (SearchType.ContainsKey("CKBinstituteType"))
{
}
目前您正在将您的词典转换为列表,我不确定您的词典是否真的需要列表然后进行线性搜索。如果您真的必须根据true
值过滤掉Dictionary,那么将结果集投影到字典中,然后使用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"))
{
}
答案 1 :(得分:2)
区别在于
stringExpr.Contains("CKBinstituteType")
检查stringExpr
的子字符串是否等于"CKBinstituteType"
,而
stringExpr == "CKBinstituteType"
检查stringExpr
本身是否等于"CKBinstituteType"
。
在两种情况下,使用序数比较(文化不变量)。作为一个明确的例子
"xyzxyzCKBinstituteTypexyzxyzxyz".Contains("CKBinstituteType")
是true
而
"xyzxyzCKBinstituteTypexyzxyzxyz" == "CKBinstituteType"
是false
。
效果:stringExpr.Contains("CKBinstituteType")
将慢于stringExpr == "CKBinstituteType"
。请注意,我没有解决这些字符串是Dictionary<string, Something>
中的键的事实。见哈比卜的回答。 Dictionary<,>
提供对密钥的快速(O(1))查找。执行dict.Where(x => criterion).ToList()
时,您不会使用它。
答案 2 :(得分:0)
contains()
检查子字符串,其中equals()
检查整个字符串,其他区别是,contains()
获取CharSequence类的对象,其中equals()
获取对象作为参数
答案 3 :(得分:0)
关于在等效字符串上使用比较或等于是否有任何区别:
使用ReSharper查看Compare的源代码,它首先做的是
if ((Object)strA == (Object)strB)
{
return 0;
}
所以看起来它们对于等效的字符串基本上是相同的。
就性能而言,this blog讨论了差异,尽管评论包含最有用的比较。即使在非常大的循环中运行它们之后,大多数评论员似乎发现微不足道的差异。最后一条评论显示Equals和Contains之间存在很大差异,让我想知道为什么结果与其他结果没有太大关系。