Как перебрать словарь используя c# - PullRequest
0 голосов
/ 22 января 2020

У меня есть один

Dictionary<string, List<string>> demo = new Dictionary<string, List<string>>();

List<String> key1val= new List<string>();
key1val.Add("1");
key1val.Add("2");
key1val.Add("3");

List<String> key2val= new List<string>();
key2val.Add("4");
key2val.Add("5");

demo.Add("key1", key1val);
demo.Add("key2", key2val);

foreach (var item in demo)
{
    foreach(var it in item.Value)
    {
        Console.WriteLine(it);
    }
}

Я хочу выполнить итерацию, хотя все ключи, такие как key1,key2.

, если текущий элемент равен key1, тогда внутри l oop должны принимать все значения по отношению к key1 и повторить его во 2-й l oop

loop
iterate though key1
iterate though [1,2,3] 

loop
iterate though key2
iterate though [4,5] 

Ответы [ 5 ]

2 голосов
/ 22 января 2020

Использование LINQ SelectMany для накопления значений в единый список:

foreach (string value in demo.SelectMany(kvp => kvp.Value))
{
    Console.WriteLine(val);
}
1 голос
/ 22 января 2020

Linq Решение включает Concat для объединения Key и Values в одну коллекцию и от SelectMany до сглаживания их:

Dictionary<string, List<string>> demo = ...

var result = demo
  .SelectMany(pair => new string[] { pair.Key }.Concat(pair.Value));  

// Let's have a look
foreach (var item in result)
  Console.WriteLine(item);
1 голос
/ 22 января 2020

Хорошо, используйте 2 вложенных цикла.

Внешний цикл, повторяющийся над ключами, внутренний цикл над значениями соответствующей записи:

Dictionary<string, List<string>> demo = new Dictionary<string, List<string>>();

List<String> key1val= new List<string>();
key1val.Add("1");
key1val.Add("2");
key1val.Add("3");

List<String> key2val= new List<string>();
key2val.Add("4");
key2val.Add("5");

demo.Add("key1", key1val);
demo.Add("key2", key2val);

foreach (var key in demo.Keys)
{
    Console.WriteLine(key);
    foreach (var elem in demo[key])
    {
        Console.WriteLine(elem);
    }
}

Это выводит

key1
1
2
3
key2
4
5
0 голосов
/ 22 января 2020
foreach (var item in demo)
{
    Console.WriteLine("loop");
    Console.WriteLine($"iterate though {item.Key}");
    var valueAsString = $"[{String.Join(",", item.Value)}]";
    Console.WriteLine($"iterate though {valueAsString}");
}

Выход:

loop
iterate though key1
iterate though [1,2,3]

loop
iterate though key2
iterate though [4,5]

Вы можете проверить: https://dotnetfiddle.net/REqIdD

0 голосов
/ 22 января 2020
foreach (var item in demo )
{
   WriteLine("loop");
   WriteLine($"iterate though {item.key}");
   WriteLine($"iterate though {item.Value}");
   WriteLine();
}

Это должно вывести именно то, что вы хотите Но вы можете:

foreach (var item in demo )
{
   WriteLine("loop");
   WriteLine($"iterate though {item.key}");
   if (item.Value is IEnumerable<string> val) foreach(var v in val) WriteLine(v);
   WriteLine();
}
...