Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/47: Рейтинг темы: голосов - 47, средняя оценка - 4.72
22 / 20 / 13
Регистрация: 19.07.2015
Сообщений: 99
.NET 4.x

Перебор Dictionary и сравнение с элементами List

19.08.2015, 15:45. Показов 9221. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Пишу программу и всё в толк не возьму, как осуществить перебор Dictionary по ключам и сравнение их значений со значениями List-а. Затем, если несколько значений совпало, мне нужно узнать ключ Dictionary, в котором были совпадения. Для примера должно получиться что-то такое:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public int keyIndex = 0;
 
public void Checking(List<string> Slist)
{
     foreach (var d in dict.Keys)
     {
         if (dict.Values.Contains(Slist))
         {
             keyIndex++;
         }
     }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.08.2015, 15:45
Ответы с готовыми решениями:

Правильное использование и перебор для Dictionary<DateTime, List<string>>
Здравствуйте! есть Dictionary&lt;DateTime, List&lt;string&gt;&gt; datenote = new Dictionary&lt;DateTime, List&lt;string&gt;&gt;(); public void...

Сравнение List, Dictionary, Hashset
Здравствуйте! Подскажите, где можно узнать про колекции List, Dictionary, Hashset такие вещи как: 1) алгоритмы их работы 2)...

Сложный Dictionary<MyClass, Dictionary<List<MyClass2>, List<string>>> MyDictionary
Здравствуйте. Помогите plz реализовать обращения к словарю вида : Dictionary&lt;MyClass, Dictionary&lt;List&lt;MyClass2&gt;,...

13
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
19.08.2015, 15:55
C#
1
2
3
4
5
6
7
8
9
10
public IEnumerable<int> Checking(List<string> Slist)
{
    foreach (var kv in dict)
    {
        if (Slist.Contains(kv.Value))
        {
            yield return kv.Key
        }
    }
}
0
22 / 20 / 13
Регистрация: 19.07.2015
Сообщений: 99
19.08.2015, 15:56  [ТС]
Забыл добавить, что Dictionary у меня содержит string ключ и list значений
C#
1
public readonly Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
19.08.2015, 16:06
C#
1
2
3
4
5
6
7
foreach (int i in dict.Keys)
{
    if (Slist.Contains(dict[i]))
    {
        // i - это ключ словаря, для котого нашлось совпадение.
    }
}
Добавлено через 5 минут
Цитата Сообщение от ByMedion Посмотреть сообщение
Забыл добавить, что Dictionary у меня содержит string ключ и list значений
нашёл на просторах интернета, как только загуглил:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            List<byte> list1 = new List<byte>() { 0, 0, 0 };
            List<byte> list2 = new List<byte>() { 0, 0, 0 };
            Console.Write(list1.ListEquals(list2));
        }
    }
    public static class ListExtension
    {
        public static bool ListEquals<T>(this List<T> target, List<T> source) where T : struct
        {
            if (target.Count != source.Count)
                return false;
            else
            {
                for (int i = 0; i < target.Count; i++)
                {
                    if (!target[i].Equals(source[i]))
                    return false;
                }
                return true;
            }
        }
    }
}
0
22 / 20 / 13
Регистрация: 19.07.2015
Сообщений: 99
19.08.2015, 16:08  [ТС]
BozKurt, Проблема в том, что у меня лист стринговских ключей, так выдаст ошибку, ответ на 1-ое сообщение
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
19.08.2015, 16:10
так уберите фильтр:
C#
1
public static bool ListEquals<T>(this List<T> target, List<T> source)
1
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
19.08.2015, 16:12
ByMedion, методу расширения в представленном примере вообще побоку какой тип содержится в коллекции. Я просто целиком пример скопи-пастил.

Добавлено через 43 секунды
Цитата Сообщение от Konctantin Посмотреть сообщение
так уберите фильтр
Упс! Опять запамятовал. Пора домой...
0
22 / 20 / 13
Регистрация: 19.07.2015
Сообщений: 99
19.08.2015, 16:58  [ТС]
Долго бился головой об код, так ничего и не вышло, если будут ещё варианты, буду благодарен!
Чуть проясню ситуацию, этот код у меня находится в dll-ке, и то, что возвратит моя функция, передастся в главную форму.
Предположим, что у меня есть Directionary, и в ней ключи - это названия магазинов, а значения ключей - это список товаров. Когда я в главной форме в листбоксе выбираю несколько товаров, мне поиск должен выбить список магазинов, в которых есть эти товары.

Добавлено через 7 минут
И кстати, сий код
C#
1
2
3
4
5
6
for (int i = 0; i < target.Count; i++)
{
     if (!target[i].Equals(source[i]))
     return false;
}
return true;
можно заменить на linq
C#
1
return !target.Where((t, i) => !t.Equals(source[i])).Any();
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
19.08.2015, 17:21
Лучший ответ Сообщение было отмечено ByMedion как решение

Решение

ByMedion, возможно так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
 
namespace ConsoleApplication4 {
    class Program {
        static Dictionary<string, List<string>> AllGoods = new Dictionary<string, List<string>>();
        static void Main(string[] args) {
            AllGoods.Add("point1", new List<string>() { "good1", "good2", "good3" });
            AllGoods.Add("point2", new List<string>() { "good2", "good3", "good4" });
            AllGoods.Add("point3", new List<string>() { "good4", "good5", "good6" });
            string[] goods = { "good2", "good3" };
 
            var res = AllGoods.Keys.Where(s => AllGoods[s].Intersect(goods).Count() != 0);
            foreach (var r in res) {
                Console.WriteLine("Point: {0}", r);
            }
            Console.ReadLine();
        }
    }
}
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.08.2015, 17:47
Лучший ответ Сообщение было отмечено ByMedion как решение

Решение

C#
1
2
3
4
5
6
7
8
9
public static class Foo
{
    public static IEnumerable<TKey> FindValuesInList<TKey, TValue>(this IDictionary<TKey, TValue> dictionary,
                                                                   IEnumerable<TValue> collection)
    {
        var set = new HashSet<TValue>(collection);
        return dictionary.Where(x => set.Contains(x.Value)).Select(x => x.Key);
    }
}
Работает на порядки быстрее, требует немного больше памяти.
1
 Аватар для Tsin
1180 / 488 / 188
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
19.08.2015, 17:48
Лучший ответ Сообщение было отмечено ByMedion как решение

Решение

ByMedion, найдёт магазины, в которых присутствуют сразу все товары из списка

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
static void Main(string[] args)
        {
            Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();
            dict.Add("Grocery1", new List<string>() { "Watermelon", "Plum", "Apple", "Peach", "Grapes", "Milk" });
            dict.Add("Grocery2", new List<string>() { "Milk", "Plum", "Apple", "Peach", "Grapes" });
            dict.Add("Grocery3", new List<string>() { "Apple", "Plum", "Grapes" });
            dict.Add("Grocery4", new List<string>() { "Watermelon", "Plum", "Apple", "Peach", "Milk", "Grapes", "Egg" });
 
            List<string> basket = new List<string>() 
            { 
                "Watermelon", 
                //"Plum", 
                "Apple", 
                //"Peach", 
                //"Milk", 
                //"Grapes", 
                //"Egg",
            };
 
            var result = dict.Where(shop => basket.Intersect(shop.Value).Count() == basket.Count);
 
            foreach (var grocery in result)
            {
                Console.WriteLine(grocery.Key);
            }
 
            Console.ReadKey();
        }

Не по теме:

Ой, уже наотвечали :)

1
22 / 20 / 13
Регистрация: 19.07.2015
Сообщений: 99
19.08.2015, 18:26  [ТС]
Всем спасибо большое за ответы! Самый подходящий от insite2012!
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.08.2015, 18:42
ByMedion, дело ваше Хотя на больших списках будет тормозить сильно.
0
22 / 20 / 13
Регистрация: 19.07.2015
Сообщений: 99
19.08.2015, 19:12  [ТС]
Ну эт ничего, я так же попробую и ваше, впрочем все ответы хороши
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.08.2015, 19:12
Помогаю со студенческими работами здесь

Перебор элементов Dictionary
Здравствуйте! Подскажите как мне пройтись по значениям коллекции такого типа с помощью цикла &quot;for&quot;?

Sort list in Dictionary
У меня есть Dictionary, в котором ключом служат размеры файла в килобайтах, а значением листы с информацией о файлах которые столько...

List.Add, когда добавляю новые элементы в list то весь лист заполняется этими элементами
List&lt;Employee&gt; emp = new List&lt;Employee&gt;(); string userAction = &quot;&quot;; int id = 0; ...

Сортировка dictionary + List<class>
Есть следующие данные: class Loot { public string Name; public string ShortName; public int ChanceBarrel = 0; ...

XmlDocument против Dictionary и List
Сразу к сути: В классе используются var dic = new Dictionary&lt;string, Dictionary&lt;string, int&gt;&gt;(); var dic2 = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru