C # Словарь фильтрации значений (LINQ) и получение ключа - PullRequest
0 голосов
/ 27 мая 2018

у меня есть словарь fooDictionary<string, MyObject>.

Я фильтрую fooDictionary, чтобы получить только MyObject с определенным значением свойства.

//(Extension method is a extension method that I made for the lists
//(PS: ExtensionMethod returns only 1x MyObject))
fooDictionary.Values.Where(x=>x.Boo==false).ToList().ExtensionMethod(); 

Но я также хочу получить ключи уже отфильтрованного MyObject's.Как я могу это сделать?

1 Ответ

0 голосов
/ 27 мая 2018

Вместо простого извлечения значений, запросите KeyValuePair

fooDictionary.Where(x => !x.Value.Boo).ToList();

Это даст вам все пары значений ключа, где MyObject имеет значение Boo false.

Примечание: я изменил вашу строку x.Value.Boo == false на !x.Value.Boo, так как это более распространенный синтаксис и (IMHO) легче читать / понимать намерения.

РЕДАКТИРОВАТЬ

На основании того, что вы обновили вопрос, чтобы перейти от работы со списком к этому новому ExtensionMethod, вот обновленный ответ (я оставляю все остальное как есть, поскольку он отвечает на исходный вопрос, который был опубликован)).

// Note this is assuming you can use the new ValueTuples, if not
// then you can change the return to Tuple<string, MyObject>
public static (string key, MyObject myObject) ExtensionMethod(this IEnumerable<KeyValuePair<string, MyObject>> items)
{
    // Do whatever it was you were doing here in the original code
    // except now you are operating on KeyValuePair objects which give
    // you both the object and the key
    foreach(var pair in items)
    {
         if ( YourCondition ) return (pair.Key, pair.Value);
    }
}

И используйте это так

(string key, MyObject myObject) = fooDictionary.Where(x => !x.Value.Boo).ExtensionMethod();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...