class Employee
{
int id;
Position position;
}
class Position
{
string name;
}
public List<List<Tuple<Position, Employee>>> getAllCombinations(Dictionary<Position, int> positionToCountMap, List<Employee> allEmployees)
{
}
positionToCountMap будет примерно так: {"Менеджер", 1}, {"Разработчик", "3"}, {"PM", "1"} (неизвестно, сколько ключей есть)
Мне нужно вернуть список всех возможных комбинаций allEmployees, чтобы он удовлетворял требованиям подсчета в positionToCountMap. Мне нужны комбинации из 1 менеджера, 3 разработчиков и 1 PM. Мой первый шаг состоял в том, чтобы создать новый словарь позиции для списка сотрудников с этой позицией.
var positionToEmployeeMap = new Dictionary<Position, List<Employee>>()
//Loop through allEmployees adding each to this dictionary
Теперь проблема в том, что у меня есть несколько списков, и мне нужно найти все возможные комбинации, беря сумму, указанную в positionToCountMap из каждого списка.
Это хороший способ подойти к проблеме? Даже если это так, я не могу оборачивать голову тем, как я на самом деле переборщил бы это. Сначала я пытался думать о каком-то рекурсивном решении, но размер списка может быть достаточно большим, чтобы рекурсия не могла быть отличным выбором. Я застрял и мог использовать некоторые советы.
EDIT Я думаю, что у меня есть решение, хотя это не очень хорошо, и я все равно хотел бы получить совет.
var positionToEmployeeMap = new Dictionary<Position, List<Employee>>()
//Loop through allEmployees adding each to this dictionary
var relevantLists = new List<Employee>();
//for each key in positionToCountMap, find the list in positionToEmployeeMap and add it to relevantLists
var allCombos = new List<List<Employee>>();
//Loop through relevantLists. For each list, recursively generate all possible combinations of sublists of size N, where N is the number in positionToCountMap. Add a list of all the combinations to allCombos
//recursively loop through allCombos finding all possible combinations taking 1 element from each list
Я бы использовал LINQ. Вы можете сделать что-то подобное операции SQL CROSS JOIN
со следующим:
var ListA = new List<object>();
var ListB = new List<object>();
var ListC = new List<object>();
var result = (from a in listA
from b in listB
from c in listC
select new { a, b, c }).ToList();
Это приведет к списку, включающему все комбинации значений в ListA, ListB и ListC.