Мой вопрос о сравнении списка <string>со словаремиспользуя C # linq - PullRequest
2 голосов
/ 27 июня 2019

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

Ссылка по ссылке ниже: Массив со словарем в c # с использованием Linq

Пример приведен в той же ссылке выше. Любой, как я предоставлю то же самое ниже

Dictionary<int, List<string>> dict = new Dictionary<int, <string>>
{ 
    {1, new List<string>(){"A","B"}},
    {2, new List<string>(){"C","D"}},
    {3, new List<string>(){"G","H"}},
    {4, new List<string>(){"E","F"}},
    {5, new List<string>(){"I","J"}},
};

string[] values = new [] 
{
    "A", "D", "E"
};

var result = 
  from kvp in dict
  join s in values on kvp.Value equals s
select new {kvp.Key, Found = true};

То, что я попробовал, ниже:

var result = dict
  .Select(x => new { 
     keys = x.Key, 
     values = values
       .ToList()
       .Any(x.Value.Contains) 
   });

Я ожидаю, что результат будет похож на {1,A},{2,D},{4,E}, но на самом деле идет {1,True},{4,True},{5,True}

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

Ответы [ 3 ]

4 голосов
/ 27 июня 2019

Технически, если вы хотите, скажем, List<object> == {1, "A", 4, "D", 5, "E"};

Я ожидаю, что результат будет выглядеть как {1,A,4,D,5,E}

, вы можете попробовать Where, чтобы отфильтроватьdict записей и SelectMany их сглаживание:

  Dictionary<int, string> dict = new Dictionary<int, string>() { 
    {1, new "A"},
    {2, new "B"},
    {3, new "c"},
    {4, new "D"},
    {5, new "E"},
  };

  string[] values = new [] {"A", "D", "E"};

  var result = dict
    .Where(pair => values.Contains(pair.Value))
    .SelectMany(pair => new object[] { pair.Key, pair.Value})
    .ToList();

  Console.Write(string.Join(", ", result));

Результат:

  1, A, 4, D, 5, E

Однако я сомневаюсь, действительно ли вам нужно такое странное представление данных.Отфильтрованная коллекция (или словарь) без SelectMany более удобна:

  List<KeyValuePair<int, string>> result = dict
    .Where(pair => values.Contains(pair.Value))
    .ToList();

  Console.Write(string.Join(", ", result.Select(pair => $"{pair.Key}, {pair.Value}")));

или

  Dictionary<int, string> result = dict
    .Where(pair => values.Contains(pair.Value))
    .ToDictionary(pair => pair.Key, pair => pair.value);

  Console.Write(string.Join(", ", result.Select(pair => $"{pair.Key}, {pair.Value}")));

, которые дают тот же результат:

  1, A, 4, D, 5, E

Редактировать: Ну, проблема сильно изменилась .Теперь у нас есть

  Dictionary<int, List<string>> dict = new Dictionary<int, <string>>() { 
    {1, new List<string>() {"A", "B"}},
    {2, new List<string>() {"C", "D"}},
    {3, new List<string>() {"G", "H"}},
    {4, new List<string>() {"E", "F"}},
    {5, new List<string>() {"I", "J"}},
  };

  string[] values = new [] { "A", "D", "E" };

И мы хотим отфильтровать Dictionary<int, List<string>>:

  var result = dict
    .Select(pair => new {
      key = pair.Key,
      value = pair.Value.Intersect(values).ToList()
    })
    .Where(item => item.value.Any())
    .ToDictionary(item => item.key, item => item.value);

  Console.Write(string.Join(Environment.NewLine, result
    .Select(pair => $"{pair.Key} : [{string.Join(", ", pair.Value)}]"))); 

Результат:

1 : [A]
2 : [D]
4 : [E]   
1 голос
/ 27 июня 2019

Проверьте этот код

Dictionary<int, string> dict = new Dictionary<int, 
string>
 { 
  {1, "A"},
  {2, "B"},
  {3, "c"},
  {4, "D"},
  {5, "E"},
 };

 string[] values = new [] 
 {
   "A", "D", "E"
 };

Здесь вы хотите просто выбрать dict, который содержит значения dict.

напишите linq так:

var query=dict.Where(x=>values.Contains(x.Value));

Итак, вы получитевывод, как показано ниже:

[1, A]
[4, D]
[5, E]

Для более подробной информации, пожалуйста, проверьте это

1 голос
/ 27 июня 2019

Итак, вы в основном хотите выбрать пары ключ-значение в словаре, где значения находятся в массиве 'values', верно?

Примерно так:

(from kvp in dict
 where values.Contains(kvp.Value)
 select kvp).ToDictionary(key => kvp.Key, value => kvp.Value);

Должно работать, но я не могу проверить это прямо сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...