2016-01-29 4 views
3

Название может быть не таким точным, как хотелось бы. Я покажу вам на примере:Создание списка с количеством элементов, надежным из другого списка

List<int> anotherList = new List<int>(); 
[0] 3 
[1] 6 
[2] 2 
[3] 3 
[4] 2 
[5] 2 
[6] 1 

List Я хочу создать должен содержать элементы, умноженные на элементы в anotherList.

Например:

List<int> newList = new List<int>(); 
[0] 3 
[1] 3 
[2] 3 
[3] 6 
[4] 6 
[5] 6 
[6] 6 
[7] 6 
[8] 6 
[9] 2 
[10] 2 
[11] 3 
[12] 3 
[13] 3 
[14] 2 
[15] 2 
[16] 2 
[17] 2 
[18] 1 

Я знаю, что этот список может показаться совершенно бесполезны для тех, кто, но я на самом деле нужно, чтобы двигаться дальше с моей программой. На самом деле было бы полезно помочь с этим!

+2

Я не могу понять, что вы пытаетесь сделать –

+0

Вы пробовали что-нибудь? Кажется, простая задача с простой петлей foreach – Pikoh

+1

Это домашнее задание? – derape

ответ

5

Вы можете использовать Linq «s Enumerable.Repeat с SelectMany:

List<int> newList = otherList 
    .SelectMany(x => Enumerable.Repeat(x, x)) 
    .ToList(); 

Метод расширения SelectMany принимает IEnumerable<T>s отбираться с данным предикатом и сглаживает их в один IEnumerable<T>. (Не обязательно же T из IEnumerable<T>, что метод был вызван для!)

Enumerable.Repeat метод, получает количество раз, чтобы повторить определенный object и возвращает IEnumerable того, что object повторяется.

+1

Всего на 16 секунд медленнее, чем JS. Ты был чертовски быстрым человеком. .. –

+0

Ха-ха :) теперь это комплимент ... –

+0

Спасибо. Он работал отлично, как я хотел! – goliatpiotr

10

LINQ делает это легко с SelectMany и Enumerable.Repeat:

var result = input.SelectMany(x => Enumerable.Repeat(x, x)).ToList(); 

SelectMany является операция выравнивания: для каждого входа в исходной последовательности, генерируют новую последовательность, используя заданную проекцию ... и общий результат представляет собой последовательность, которая содержит все эти «подпоследовательности» как одну плоскую последовательность.

Оттуда вам нужна проекция, которая в вашем случае равна «для элемента x, результатом является x, x раз». Это легко сделать с Enumerable.Repeat(x, x).

+0

Спасибо, но уже реализовано то, что предложил @Tamir Vered :) – goliatpiotr

+1

@goliatpiotr: Ну, это точно такое же решение, просто отступы по-разному и с разными именами :) –