包含和等于(==)之间的差异

时间:2014-05-12 12:49:47

标签: c# dictionary

我有一个字典属性

 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")
    {

    }                   
}

它们之间有什么区别?哪一个对我的情况有好处? (如性能,代码标准等)

4 个答案:

答案 0 :(得分:6)

  

它们之间有什么不同?

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

  

哪一个对我的情况有好处? (比如表现,代码   标准,等)

使用 ContainsKey方法,而不是字符串equals或contains。 在foreach循环中使用包含和等于,您将Key stringContainsEquals进行比较。您不需要在字典中迭代每个项目。如果您尝试通过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之间存在很大差异,让我想知道为什么结果与其他结果没有太大关系。