从Dictionary>获取值时出现问题

本文关键字:int 问题 获取 List Dictionary | 更新日期: 2023-09-27 18:10:22

我有一个定义如下的字典

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

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

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

假设它成立

100 105 110 200

我将我的字典的值存储如下。假设我分别有两个键10和20,对于这些键值,我将使用10 i will have 100,105 and 110and for 20 i will have 200的值。

我想将这些值与可用的列表进行比较lstdbTaskID

I tried this

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

但是我得到的错误如下

最好的重载方法匹配'System.Collections.Generic.Dictionary>.ContainsValue(System.Collections.Generic.List)'有一些无效参数'

不能从'int'转换为'System.Collections.Generic.List' '

有谁能帮我吗?

从Dictionary<int, List<int>>获取值时出现问题

您的代码是错误的,因为您试图将int值与intList进行比较。

你的字典是:intDictionaryintList .

还有另一个结构asList/int

所以当你这样做的时候:

// 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语句

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

编辑:如果你不需要linq,请自己执行linq任务。

foreach (int strlst in lstdbTaskID)
{
    foreach (int key in dict1.Keys)
    {
        if (dict1[key].Contains(strlst))
        {
            // do something
        }
    }
}

查看您在字典中存储的的类型-它是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))
    }
}

…但是你并没有把字典当作字典来使用在这里。

我完全理解你的问题有点小问题,但是,我的回答应该会把你推向正确的方向。鉴于您无法访问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>),如果:

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

好吧,dict1是字典的字典,而不是整数。所以dict1.ContainsValue接受一个字典作为参数——你检查它是否包含一个给定的字典。但是你给了它一个int

试试这个:

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