A Dictionary<,>
действительно не подходит для поиска ключей по значению. Вы можете написать двунаправленный словарь, как Я сделал в этом ответе , но он не будет обязательно лучшим подходом.
Конечно, вы можете использовать словарь как последовательность пар ключ / значение, чтобы вы могли иметь:
var keysForValues = dictionary.Where(pair => values.Contains(pair.Value))
.Select(pair => pair.Key);
Просто знайте, что это будет операция O (n), даже если ваши "значения" - это HashSet
или что-то подобное (с эффективной проверкой содержимого).
РЕДАКТИРОВАТЬ: Если вам действительно не нужно отношение ключ / значение - если это больше похоже на пары - тогда использование List<Tuple<Foo, Bar>>
будет иметь определенный смысл. Запрос в конечном итоге остается тем же:
public IEnumerable<T1> GetAllFirst<T1, T2>(IEnumerable<Tuple<T1, T2>> source,
IEnumerable<T2> seconds)
{
HashSet<T2> secondsSet = new HashSet<T2>(seconds);
return source.Where(pair => secondsSet.Contains(pair.Item2));
}
public IEnumerable<T2> GetAllSecond<T1, T2>(IEnumerable<Tuple<T1, T2>> source,
IEnumerable<T1> firsts)
{
HashSet<T1> firstsSet = new HashSet<T1>(firsts);
return source.Where(pair => firstsSet.Contains(pair.Item1));
}