Вы можете легко решить подобные проблемы с помощью LINQ.
var solutions = from pair1 in listOne
where IsCandidate(pair1)
from pair2 in listTwo
where IsCandidate(pair1, pair2)
from pair3 in listThree
where IsCandidate(pair1, pair2, pair3)
from pair4 in listFour
where IsCandidate(pair1, pair2, pair3, pair4)
from pair5 in listFive
where IsCandidate(pair1, pair2, pair3, pair4, pair5)
from pair6 in listSix
where IsCandidate(pair1, pair2, pair3, pair4, pair5, pair6)
from pair7 in listSeven
where IsSolution(pair1, pair2, pair3, pair4, pair5, pair6, pair7)
select new { pair1, pair2, pair3, pair4, pair5, pair6, pair7 };
Конечно, этот подход действителен только потому, что число списков известно во время компиляции.Альтернативный подход заключается в том, чтобы иметь общий способ построения возможных комбинаций, как Эрик Липперт показывает в своем посте .
Все эти промежуточные звенья where
во всем запросе должны фильтроваться.как можно быстрее выводить недопустимые комбинации.
РЕДАКТИРОВАТЬ
Исправлено решение, позволяющее эффективно подсчитывать, сколько раз встречается одна и та же комбинация, игнорируя ключи исходного источника.
Чтобы добиться этого, я собираюсь применить преобразование к каждому словарю.Я собираюсь преобразовать каждый словарь в новый словарь, где ключом будет значение перечисления, а значением будет количество раз, когда значения перечисления происходят в исходном словаре.
IDictionary<MyEnum, int> CountOccurrences(IEnumerable<MyEnum> values)
{
return (from e in values group e by e).ToDictionary(grp => grp.Key, grp => grp.Count());
}
var solutions = from p1 in CountOccurrences(listOne.Values)
where IsCandidate(p1)
from p2 in CountOccurrences(listTwo.Values)
where IsCandidate(p1, p2)
from p3 in CountOccurrences(listThree.Values)
where IsCandidate(p1, p2, p3)
from p4 in CountOccurrences(listFour.Values)
where IsCandidate(p1, p2, p3, p4)
from p5 in CountOccurrences(listFive.Values)
where IsCandidate(p1, p2, p3, p4, p5)
from p6 in CountOccurrences(listSix.Values)
where IsCandidate(p1, p2, p3, p4, p5, p6)
from p7 in CountOccurrences(listSeven.Values)
where IsSolution(p1, p2, p3, p4, p5, p6, p7)
select new {
E1 = p1.Key,
E2 = p2.Key,
E3 = p3.Key,
E4 = p4.Key,
E5 = p5.Key,
E6 = p6.Key,
E7 = p7.Key,
Times = p1.Value * p2.Value * p3.Value * p4.Value * p5.Value * p6.Value * p7.Value
};