【问题标题】:issue while getting values from Dictionary<int, List<int>>从 Dictionary<int, List<int>> 获取值时出现问题
【发布时间】:2011-10-03 20:07:09
【问题描述】:

我有一本定义如下的字典

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>.ContainsValue(System.Collections.Generic.List)' 的最佳重载方法匹配有一些无效参数`

无法从“int”转换为“System.Collections.Generic.List”`

有什么可以帮助我的吗?

【问题讨论】:

  • 2011 年末坚持使用 .NET 2.0 的原因是什么??!
  • 由于我的产品是这样开发的,我们必须坚持这一点
  • 请更新您正在使用 .NET framework 2 的问题,否则用户将继续发布 LINQ 查询,无论如何这不会解决您的问题.. :)。
  • @User:您的团队绝对应该考虑升级到 3.5(需要少量测试)或 4.0(需要更多测试)的问题
  • abatishchev 是的,我也知道,但是按照这里的规则我应该怎么做,我们必须在 2.0 框架中编码,否则我们必须将整个产品移动到 3.0 or 4.0

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


【解决方案1】:

您的代码有误,因为您试图将 int 的值与 Listint 进行比较。

你的字典是: DictionaryintListint

你有另一个结构 Listint

所以当你这样做时:

// 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
        }
    }
}

【讨论】:

  • 我已经说过我没有使用 linq,因为我正在开发 2.0 框架,所以你能按照这个给出吗
【解决方案2】:

查看您在字典中存储的 的类型 - 它是 List&lt;int&gt;不是 int。因此,询问字典是否包含值 5 是没有意义的。

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

例如:

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

但是,这确实不是一种非常有效的表示方式。目前尚不清楚最好的表示它是什么,但不知道您将如何处理结果。例如,您可能只想要一个包含所有列表中所有值的 HashSet&lt;int&gt; - 但如果您想返回其值包含特定 ID 的键,那就另当别论了。

编辑:在 .NET 2.0 领域,您可以使用:

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

...但是您实际上并没有使用字典 as 在这两种情况下都是字典...

【讨论】:

  • @User:好的,我已经更新了我的答案——但不清楚你为什么真的想这样做。字典旨在提供快速的键值查找;您只是将其用作此处的列表列表。另请注意,在您的示例中,您使用的是lstdbTaskID[strlst],其中strlst 已经是lstdbTaskIDotem,这听起来不太可能是您想要做的。如果你让你的变量名不那么神秘,它可能有助于让你的问题更容易理解......
  • 是的,我写的主要代码是按照PSJoshi给出的,我将比较键值然后包含值然后这是一个字典大小写正确
【解决方案3】:

我在完全理解您的问题时遇到了一些小问题,但是,我的回答应该会将您推向正确的方向。看到您无权访问 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&lt;int&gt;,因为它查找值要快得多(并且在.Net 2.0 中受支持);但是,如果:

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

【讨论】:

    【解决方案4】:

    好吧,dict1 是字典,而不是整数。所以dict1.ContainsValue 将字典作为参数 - 您正在检查它是否包含给定的字典。但是你给它一个int

    试试这个:

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

    【讨论】:

    • 我可以在没有linq 的情况下拥有这个,因为我使用的是 2.0 框架
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    相关资源
    最近更新 更多