【问题标题】: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
}
}
我想知道我是否可以执行检查,但检查它是否不存在,然后继续。
我该怎么做?使用 ||还是&&?
我不能假设键/值在那里,所以我不希望它崩溃。
【问题讨论】:
标签:
c#
dictionary
collections
【解决方案1】:
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 查询会更优雅。
【解决方案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,则不会评估 && 的右侧。