Нужно получить все комбинации из нескольких списков, принимая наборы сумм из каждого списка

1
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
Теги:
list
algorithm

1 ответ

-1

Я бы использовал 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.

  • 0
    Проблема в том, что он должен быть больше, чем один из каждого списка. Как и в приведенном выше примере в OP, мне понадобится один элемент из списка A, три из списка B и один из списка C.
  • 0
    Кроме того, неизвестно, сколько ключей в словаре, поэтому я не могу просто предположить, что это будет только 3 списка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню