【问题标题】:Checking if my dictionary<int, list<int>> has an item in the list检查我的 dictionary<int, list<int>> 列表中是否有项目
【发布时间】:2009-10-28 22:17:56
【问题描述】:

我现在正在这样做:

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

  // do something
}
}

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

我该怎么做?使用 ||还是&&?

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

【问题讨论】:

  • foreach 循环的内容是什么?

标签: c# dictionary collections


【解决方案1】:
foreach(..)
{
    if(!myDic.ContainsKey(car.ID) || !myDic[car.ID].Contains(car.MfgID))
    {
        continue;  
    }

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

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

【讨论】:

    【解决方案2】:

    如果你有可用的 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.
    }
    

    【讨论】:

      【解决方案3】:

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

      foreach (...)
      {
          if (!myDic.ContainsKey(car.ID))
             continue;
      
          if (!myDic[car.ID].Contains(car.MfgID))
             continue;
      
          // do something actually
      }
      

      (有时可以提高可读性)

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-21
          相关资源
          最近更新 更多