从Dictionary <int,list <int =“”>&gt; </int,>获取值时出现问题

时间:2011-10-03 11:46:31

标签: c# .net exception-handling .net-2.0

我有一本字典,定义如下

Dictionary<int, List<int>> dict1 = new Dictionary<int, List<int>>();

我将有一个列表元素,我可以存储来自数据库的值

List<int> lstdbTaskID = new List<int>();

假设这有

100 105 110 200

分别

我将使用如下存储值的字典。假设我分别有2个密钥10,20,对于这个密钥值,我将得到10 i will have 100,105 and 110 and for 20 i will have 200的值。

我想将这些值与可用列表lstdbTaskID

进行比较

我试过这个

foreach (int strlst in lstdbTaskID)
{
    if (dict1.ContainsValue(lstdbTaskID[strlst]))
}

但我得到的错误如下

  

'System.Collections.Generic.Dictionary&gt; .ContainsValue(System.Collections.Generic.List)'的最佳重载方法匹配'有一些无效的参数`

  

无法从'int'转换为'System.Collections.Generic.List'。

可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

您的代码错误,因为您要将int值与List的{​​{1}}进行比较。

你的字典是: int Dictionary int List {/ 1}}。{/ 1>

你有另一种结构 int

List

所以当你这样做时:

int

使用linq语句:

// Compiler fails here because you are trying to check whether dictionary contains
// the given integer value. Dictionary in this case has a list of integers as its `Value` 
// in its `<Key,Value>` pair.
dict1.ContainsValue(lstdbTaskID[strlst])

编辑:如果你想要没有linq,请自行执行linq任务。

foreach (int strlst in lstdbTaskID)
{
    if (dict1.Any(pair => pair.Value.Contains(strlst)))
    {
        // do something
    }
}

答案 1 :(得分:1)

查看您在词典中存储的的类型 - 它是List<int>不是 int。因此,询问字典是否包含5的值是没有意义的,比方说。

但是,询问字典是否包含本身包含5的任何值(列表)确实有意义。

例如:

foreach (int strlst in lstdbTaskID)
{
    if (dict1.Values.Any(list => list.Contains(strlst))
    {
        ...
    }
}

然而,这并不是一种非常有效的表达方式。目前尚不清楚最好的代表,但不知道你将如何处理结果。例如,您可能只想要一个包含所有列表中所有值的HashSet<int> - 但如果您想要返回其值包含特定ID的键,则这是另一回事。

编辑:在.NET 2.0版本中,您可以使用:

foreach (int strlst in lstdbTaskID)
{
    foreach (List<int> list in dict1.Values)
    {
        if (list.Contains(strlst))
    }
}

...但在这两种情况下,你真的没有使用字典作为字典......

答案 2 :(得分:0)

我完全理解你的问题时遇到了一些问题,但是,我的回答应该会把你推向正确的方向。因为您无法访问Linq(因为您使用的是.Net 2.0):

static bool IsContained(IEnumerable<int> lstdbTaskID, Dictionary<int, HashSet<int>> dict1)
{
    foreach (int strlst in lstdbTaskID)
        foreach (HashSet<int> value in dict1.Values)
            if (value != null && value.Contains(strlst))
                return true;
    return false;
}

您应该使用HashSet<int>,因为查找值要快得多(并且在.Net 2.0中受支持);但是,如果符合以下条件,则不应使用HashSet<int>(而是使用List<int>

  • 列表需要存储重复项。
  • - 或 - 值的顺序很重要。

答案 3 :(得分:-1)

嗯,dict1是一本字典词典,而不是整数。因此dict1.ContainsValue将字典作为参数 - 您正在检查它是否包含给定的字典。但是你给它一个int

试试这个:

if (dict1.Any(x => x.Value.ContainsValue(strlst))) // ...