Самый эффективный способ объединить список в списке без цикла - PullRequest
0 голосов
/ 28 сентября 2011
public class Unicorn
{
    public List<int> Numbers { get; set; }
}

unicorns.Add(new Unicorn() { Numbers = {1, 2, 3} } );
unicorns.Add(new Unicorn() { Numbers = {4, 5, 6} } );
unicorns.Add(new Unicorn() { Numbers = {7, 8, 9} } );

Какой самый эффективный способ в c # 4 объединить все списки в один список {1, 2, 3, 4, 5, 6, 7, 8, 9}?

Желательно (в идеале; по предпочтению; если у вас был выбор) без петель и без Linq. Я возился с .indAll, но он не копается.

Ответы [ 4 ]

9 голосов
/ 28 сентября 2011
List<int> theInts = unicorns.SelectMany(unicorn => unicorn.Numbers).ToList();

Без измерения единственное, что здесь дает мне паузу с точки зрения производительности, - это .ToList

Если существует TON чисел, вполне возможно, что ToList может многократно перераспределять свой резервный массив. Чтобы избежать этого поведения, вы должны иметь представление о том, сколько чисел ожидать.

List<int> theInts = new List<int>(expectedSize);
theInts.AddRange(unicorns.SelectMany(unicorn => unicorn.Numbers));
3 голосов
/ 28 сентября 2011

Ваши требования совершенно необычны, но я думаю, вы всегда можете написать:

var numbers = new List<int>();
unicorns.ForEach(unicorn => numbers.AddRange(unicorn.Numbers));

ForEach () возможно квалифицируется как "LINQ-less", поскольку он является подлинным членом List<T>, а не методом расширения в IEnumerable<T>, и на самом деле предшествует Сам LINQ.

3 голосов
/ 28 сентября 2011

Вот решение, которое полностью соответствует вашим требованиям: Нет Linq и нет цикл - я почти уверен, что вы не хотите использовать этот код, хотя:

List<Unicorn> unicorns = new List<Unicorn>();
unicorns.Add(new Unicorn() { Numbers = new List<int>{1, 2, 3} } );
unicorns.Add(new Unicorn() { Numbers = new List<int> { 4, 5, 6 } });
unicorns.Add(new Unicorn() { Numbers = new List<int> { 7, 8, 9 } });

List<int> numbers = new List<int>();
int count = 0;

AddUnicorn: 
if(count < unicorns.Count)
{
    numbers.AddRange(unicorns[count++].Numbers);
    goto AddUnicorn;
}
2 голосов
/ 28 сентября 2011

Использование оператора Zip в .NET 4.0:

     var sums = b.Zip(a, (x, y) => x + y)
        .Concat(b.Skip(a.Count()));

Если вы хотите обобщить это, проверьте, у кого больше элементов, и используйте его как «b» выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...