检查我的字典<int,list <int =“”>&gt;列表中有一个项目</int,>

时间:2009-10-28 22:17:57

标签: c# dictionary collections

我现在正在这样做:

foreach(..)
{
if(myDic.ContainsKey(car.ID) && myDic[car.ID].Contains(car.MfgID))
{

  // do something
}
}

我想知道我是否可以执行检查,但检查它是否不存在,然后继续执行。

我该怎么做?使用||或&amp;&amp;?

我不能'假设键/值在那里,所以我不希望它崩溃。

4 个答案:

答案 0 :(得分:2)

foreach(..)
{
    if(!myDic.ContainsKey(car.ID) || !myDic[car.ID].Contains(car.MfgID))
    {
        continue;  
    }

    // do something
}
  • 如果 car.ID 不是 myDic 的键 那么第一个条件是真的 没有评价第二名 条件。
  • 如果 car.ID myDic 的键,那么 将评估第二个条件 它不会崩溃,因为 myDic [car.ID] 具有有效值。

如果你在“做某事”中有一些逻辑,这种方式很有用,因为它使用了字典的良好访问复杂性。如果“做某事”只是选择值,那么整个循环只是一个过滤器,使用LINQ查询会更优雅。

答案 1 :(得分:1)

如果您有LINQ可用,您可以这样做:

myDic.Any(kvp => kvp.Key == car.ID && kvp.Value.Contains(car.MfgID));

想我会添加一点扩展,如果你想过滤列表,你可以做以下事情:

var filteredDictionary = myDic.Where(kvp => kvp.Key == car.ID 
                                         && kvp.Value.Contains(car.MfgID));

foreach(...)
{
    ... //Only enumerating over items that match both conditions.
}

答案 2 :(得分:0)

另一种常见的方法是使用几个简单的guard clauses

foreach (...)
{
    if (!myDic.ContainsKey(car.ID))
       continue;

    if (!myDic[car.ID].Contains(car.MfgID))
       continue;

    // do something actually
}

(有时可以提高可读性)

答案 3 :(得分:0)

你所拥有的是好的,是&amp;&amp ;;的右侧。如果左侧评估为false,则不评估。