Вот один из способов:
>>> a = {
... 'a' : 'banana',
... 'b' : 'orange',
... 'c' : 'pineapple',
... 'd' : 'apple' }
>>> [k for k,v in a.items() if v in set(('banana','orange'))]
['a', 'b']
>>>
set
важен только для большого количества ключей. Обратите внимание, что, как прокомментировал @DeepSpace, это требование указывает на неправильный дизайн вашего кода, и вам следует подумать о другом способе структурирования данных.
1) Я хотел бы сохранить const в mVec, чтобы он считался постоянным во всех других методах X
Это любопытное использование const
для переменной-члена. И это бросает вызов хорошему дизайну. По определению, строительство - это процесс, который требует изменения объекта.
Что касается вашего требования сохранять объект неизменяемым - используйте правильную инкапсуляцию. Вы должны использовать функции const
-member для раскрытия любой функциональности, основанной на вашем mVec
, для клиентов вашего класса.
2) Я хотел бы избежать ненужных копий, если это вообще возможно , То есть одно решение состоит в том, чтобы иметь статический метод, который создает неконстантную временную переменную для диапазона 1, вставляет диапазон 2 и возвращает его, и затем определите конкатенационный конструктор для
. Вы должны смотреть на конструкторы перемещения и ссылки на r-значения в целом (обещанная цель C ++ 0x). Прочитайте эту статью .
Если вы хотите, чтобы включение / отключение обновлялось, как только значение в TextBox изменяется
, установите UpdateSourceTrigger = "PropertyChanged»
в привязке для TextBox
.
РЕДАКТИРОВАТЬ: Если вы хотите проверить / аннулировать на основе всех привязок в элементе управления, вот несколько советов.
1) Вы уже реализуете IDataErrorInfo
. Попробуйте реализовать свойство IDataErrorInfo.Error
так, чтобы оно возвращало строку, которая недопустима для всех свойств, с которыми вы связываетесь. Это будет работать, только если весь ваш элемент управления привязан к одному объекту данных. Установите e.CanExecute = string.IsNullOrEmpty (data.Error);
2) Используйте отражение, чтобы получить все открытые статические свойства DependencyProperties для соответствующих элементов управления. Затем вызовите BindingOperations.GetBindingExpression (relatedControl, DependencyProperty)
в цикле для каждого свойства, чтобы можно было проверить проверку.
3) В конструкторе вручную создать коллекцию всех связанных свойств во вложенных элементах управления. В CanExecute выполните итерацию по этой коллекции и проверьте каждую комбинацию DependencyObject
/ DepencyProperty
, используя BindingOperation.GetBindingExpression ()
для получения выражений, а затем исследуя [11146121]. HasError .