Получить все разные значения с определенным ключом в списке словаря - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть список словарей.

List<Dictionary<String, String>> data = GetData();

Словари содержат ключ с именем «Месяц» со значениями, такими как «1/2010» и т. Д. Мне нужен список строк со всеми разными месяцами, которые появляются в списке словаря.

Ответы [ 3 ]

3 голосов
/ 08 сентября 2011

Простой с LINQ:

var months = data.Select(dict => dict["Month"]).Distinct().ToList();

Или, если не во всех словарях есть запись:

var months = data.Select(dict => {
                            string value;
                            bool hasValue = dict.TryGetValue("Month", out value);
                            return new { value, hasValue };
                         })
                 .Where(p => p.hasValue)
                 .Select(p => p.value)
                 .Distinct()
                 .ToList();

РЕДАКТИРОВАТЬ: Моя оригинальная версия не включала вызов Distinctтак что он бы включал дубликаты.Теперь не будет.

1 голос
/ 08 сентября 2011

Или, если вам нужен однострочный (выдаёт разные значения и работает, если не все словари имеют запись)

var result=data.SelectMany(x => x)
   .ToLookup(kv => kv.Key, kv => kv.Value)["Month"].Distinct().ToList();
0 голосов
/ 08 сентября 2011

Если вы не можете использовать LINQ:

List<string> months = new List<string>();
foreach (Dictionary<string, string> aDict in data)
{
    string aMonth;
    if (aDict.TryGetValue("Month", out aMonth))
        months.Add(aMonth);
}

EDIT:

Если вам не нужны дубликаты:

List<string> months = new List<string>();
foreach (Dictionary<string, string> aDict in data)
{
    string aMonth;
    if (aDict.TryGetValue("Month", out aMonth) && !months.Contains(aMonth))
        months.Add(aMonth);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...