c # получить подмножество значений из словаря по списку ключей - PullRequest
7 голосов
/ 27 февраля 2012

Хорошо, так что вы можете получить одно значение dictionary[key] или все значения dictionary.Values.

То, что я ищу, - это способ получить все значения для данного набора ключей следующим образом:

List<string> keys;
Dictionary<string, object> dictionary;

List<object> valuesForKeys = GetValuesFromDictionaryUsingKeys(dictionary, keys);

с

private List<object> GetValuesFromDictionaryUsingKeys(Dictionary<string, object> dictionary, List<string> keys)
{
    //your code here
}

Конечно, я мог бы выполнять итерации вручную по списку ключей и использовать dictionary[key] каждый раз и снова добавлять все значения обратно в список, но я бы хотел использовать более элегантный способ (например, Linq).

Спасибо.

Ответы [ 5 ]

15 голосов
/ 27 февраля 2012

Попробуйте keys.Where(k => dictionary.ContainsKey(k)).Select(k => dictionary[k]).

6 голосов
/ 27 февраля 2012

Зачем писать функцию, если вы можете использовать универсальный метод расширения для повседневного использования?

public static IEnumerable<V> GetValues<K, V>(this IDictionary<K, V> dict, IEnumerable<K> keys)
{
    return keys.Select((x) => dict[x]);
}

РЕДАКТИРОВАТЬ: Чем вы можете написать:

var  valuesForKeys = dictionary.GetValues(keys).ToList();
2 голосов
/ 26 апреля 2015

Попробуйте:

    List<object> valuesForKeys = keys.Intersect( dictionary.Keys )
                                     .Select( k => dictionary[k] )
                                     .ToList();

или по запросу:

private List<object> GetValuesFromDictionaryUsingKeys( Dictionary<string, object> dictionary, List<string> keys )
{
    // My code here
    return keys.Intersect( dictionary.Keys )
               .Select( k => dictionary[k] )
               .ToList();     
}

Используйте .Intersect для удаления ключей, отсутствующих в словаре, это быстрее, чем .Where(k => dictionary.ContainsKey(k)).

Удалите инструкцию .Intersect, чтобы разрешить вызывать исключение для ключа, не найденного в словаре.

2 голосов
/ 27 февраля 2012
private List<object> GetValuesFromDictionaryUsingKeys(Dictionary<string, object> dictionary, List<string> keys)
{
    List<object> nList = new List<object>();

    foreach (string sKey in keys)
        if (dictionary.ContainsKey(sKey))
            nList.Add(dictionary[sKey]);

    return nList;         
}
0 голосов
/ 19 ноября 2015

Необработанный ответ работает безупречно, но если вы заранее знаете, что в словаре есть ключи, это может быть более наглядно и эффективно: keys.Select(k => dictionary[k])

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