проблема при получении значений из словаря - PullRequest
0 голосов
/ 03 октября 2011

У меня есть словарь, который был определен следующим образом

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'`

Может ли кто-нибудь помочь мне в этом?

Ответы [ 4 ]

2 голосов
/ 03 октября 2011

Ваш код неверен, потому что вы пытаетесь сравнить значение int с List из int.

Ваш словарь: Dictionary из int до List из int.

и у вас есть другая структура как List из 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
    }
}

Edit: если вы хотите это без linq, выполните задачу linq самостоятельно.

foreach (int strlst in lstdbTaskID)
{
    foreach (int key in dict1.Keys)
    {
        if (dict1[key].Contains(strlst))
        {
            // do something
        }
    }
}
1 голос
/ 03 октября 2011

Посмотрите на тип значения , которое вы храните в своем словаре - это List<int>, , а не и int.Поэтому нет смысла спрашивать, содержит ли словарь, например, значение 5.

Однако имеет смысл спросить, содержит ли словарь какое-либо значение (список), которое содержит .5.

Например:

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

Однако это не очень эффективный способ его представления.Пока не ясно, что лучше всего представлять , не зная, что вы собираетесь делать с результатами.Вы можете просто захотеть, например, HashSet<int>, содержащий все значения из всех списков - но если вы хотите вернуться к ключам, значения которых содержат определенный идентификатор, это другое дело.

EDIT:В .NET 2.0 land вы можете использовать:

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

... но вы действительно не используете словарь в качестве словаря в любом случае здесь ...

0 голосов
/ 03 октября 2011

У меня небольшие проблемы с полным пониманием вашего вопроса, однако мой ответ должен подтолкнуть вас в правильном направлении. Если у вас нет доступа к 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>), если:

  • В списке должны храниться дубликаты.
  • - или - Порядок значений важен.
0 голосов
/ 03 октября 2011

Ну, dict1 - это словарь словарей, а не целых.Поэтому dict1.ContainsValue принимает словарь в качестве параметра - вы проверяете, содержит ли он данный словарь или нет.Но вы даете ему int.

Попробуйте это:

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