2013-03-06 5 views
2

У меня есть следующий:Возьмите N элементы из списка на условиях

IDictionary<QuestionDuration, Int32> rules = _service.GetRules(); 

List<Question> questions = _service.GetQuestions(); 

public class Question { 
    public QuestionDuration Duration { get; set; } 
} 

Словарных значения (Int32) являются количеством вопросов, которые мне нужно взять из списка с тем, что конкретным сроком ... Так что, если я есть словарь:

{{QuestionDuration.M2, 5}, {QuestionDuration.M4, 3}, {QuestionDuration.M8, 0}, ...

Поэтому мне нужно создать список от оригинала список из 5 вопросов 2 минуты, 4 вопроса 3 минуты, 0 вопросов 8 минут и т. д.

Я пытался сгруппировать и использовать выражение лямбда для этого, но я не смог ...

Как это сделать?

Спасибо,

Мигель

ответ

5

Это создаст IEnumerable<List<Question>> (три списки для словаря правил):

IDictionary<QuestionDuration, Int32> rules = _service.GetRules(); 
List<Question> questions = _service.GetQuestions(); 

var query = from r in rules 
      select questions.Where(q => q.Duration == r.Key) 
          .Take(r.Value).ToList(); 

Совет: если вам нужно выбрать случайные вопросы в каждом список, а затем добавить OrderBy(q => Guid.NewGuid()) перед Take оператора. Или более случайное решение:

var rand = new Random(); 
var query = from r in rules 
      select questions.Where(q => q.Duration == r.Key) 
          .OrderBy(q => rand.Next()) 
          .Take(r.Value).ToList(); 
+0

@lazyberszovsky: Элегантный; но детерминированным. Я выхожу из контекста, что ОП не хочет, чтобы одни и те же вопросы в каждой категории выбирались каждый раз. –

+0

@PieterGeerkens, но вопросы не должны быть одинаковыми, потому что продолжительность отличается (если я правильно понял вопрос) –

+0

@layberezovsky: Но первый 2-минутный вопрос будет одинаковым каждый раз; одинаковые для каждой другой продолжительности. Есть ли у вас такой же элегантный Shuffle в рукаве? –

Смежные вопросы