2014-11-12 2 views
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, чтобы он удовлетворял требованиям count в позицииToCountMap. Мне нужны комбинации из 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 

ответ

-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(); 

Это приведет к списку, включая все возможные комбинации значений в lišta, LISTB и ListC.

+0

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

+0

Также неизвестно, сколько ключей находится в словаре, поэтому я не могу просто предположить, что это будет только 3 списка. – user3715648