Dictionary.ContainsKey(employee)
здесь не поможет, потому что сотрудник является «неизвестным» значением, а Contains
не поможет, потому что он принимает KeyValuePair<employee,manager>
и ... еще раз ... ни один сотрудник не известен. ContainsValue(manager)
не поможет, потому что не возвращает никаких ключей и , потому что это не ключ, это операция O(n)
, а не O(1)
, как ContainsKey
!
Со структурой current единственный способ - использовать некоторую форму циклов, хотя я бы написал это так:
// Key is Employee, Value is Manager
// This is O(n)
var theEmployees = relations
.Where(rel => rel.Value.Equals(theManager))
.Select(rel => rel.Key);
Это будет работать только после того, как manager
дана правильная реализация Equals
. Обратите внимание, что хеш-код не используется вообще . ( Поскольку объекты, которые отличаются , могут совместно использовать тот же самый хеш-код, просто сравнение хеш-кода не является заменой для Equals
, или ==
, или CompareTo
! - в зависимости от того, какой из них подходит.)
Если таких запросов будет много , то исходная структура может быть "инвертирована".
// Build a reverse lookup-up
var employeesForManager = relations
.GroupBy(rel => rel.Value) // group on Manager
.ToDictionary(g => g.Key, g => g); // Key is the group's Manager
// This is O(1), but only valid AFTER employeesForManager is [re-]generated
var theEmployees = employeesForManager[theManager]
Это будет работать, только если manager
имеет допустимую реализацию Equals
и GetHashCode
. (GetHashCode требуется, потому что manager
объекты используются ключом к новому словарю.)
Что касается того, что "лучше" - хорошо, это зависит. Например, глупо создавать обратный поиск, чтобы использовать его только один раз. Нет проблем с производительностью, пока нет проблем с производительностью: напишите чистый код и профиль.
Удачного кодирования.