Можно ли преобразовать два или более списков в один список в .NET с помощью C #?
Например,
public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);
AddRange
метод?Ответы:
Вы можете использовать LINQ
Concat
иToList
методы:Обратите внимание, что есть более эффективные способы сделать это - вышеупомянутое будет в основном перебирать все записи, создавая буфер динамического размера. Поскольку вы можете предсказать размер для начала, вам не нужен этот динамический размер ... поэтому вы можете использовать:
(
AddRange
Специально дляICollection<T>
эффективности.)Я бы не стал использовать этот подход, если вы действительно не должны.
источник
productCollection1.ForEach(p => allProducts.Add(p))
более производительный, чем AddRange.AddRange
нужно сделать копию блока из одного базового массива в другой. У вас есть ссылки для доказательства этого?productionCollection1.ForEach(...)
более производительный, чем AddRange». Производительность очень редко так легко описывается. Я буду удивлен , что AddRange не бить его удобным , хотя - мне нужно исследовать , что дальше.AddRange
Это лучший вариант для необработанной скорости (примерно в 4 раза и чем больше списки, тем лучше увеличение), как Джон suggeste.Предполагая, что вам нужен список, содержащий все продукты для указанных идентификаторов категорий, вы можете рассматривать ваш запрос как проекцию, за которой следует операция выравнивания . Там есть оператор LINQ , что делает это:
SelectMany
.В C # 4 вы можете сократить SelectMany, чтобы:
.SelectMany(GetAllProducts)
Если у вас уже есть списки, представляющие продукты для каждого идентификатора, то вам нужно объединение , как указывают другие.
источник
Вы можете объединить их, используя LINQ:
List.AddRange()
хотя более традиционный подход к использованию может быть более эффективным.источник
Посмотрите на List.AddRange для объединения списков
источник
Вы можете использовать метод расширения Concat :
источник
источник
Я знаю, что это старый вопрос, я думал, я мог бы просто добавить свои 2 цента.
Если у вас есть,
List<Something>[]
вы можете присоединиться к ним, используяAggregate
Надеюсь это поможет.
источник
Я уже прокомментировал это, но я все еще думаю, что это верный вариант, просто проверьте, если в вашей среде лучше одно или другое решение. В моем конкретном случае использование
source.ForEach(p => dest.Add(p))
работает лучше, чем классический,AddRange
но я не исследовал, почему на низком уровне.Вы можете увидеть пример кода здесь: https://gist.github.com/mcliment/4690433
Таким образом, вариант будет:
Проверьте это, чтобы увидеть, работает ли он для вас.
Отказ от ответственности : я не защищаю это решение, я нахожу
Concat
самое ясное. Я только что сказал - в моей беседе с Джоном - что в моем аппарате этот случай работает лучше, чемAddRange
, но он говорит, с гораздо большим знанием, чем я, что это не имеет смысла. Там есть суть, если вы хотите сравнить.источник
var allProducts = lstName.Concat(lstCMSID) .Concat(lstSpecialtyPhys) .ToList();
который добавляет его в GridView, но в виде одного столбца. Я хотел бы разделить их на три отдельные колонки.Таким образом, это многомерный List, и .SelectMany () сведет его в IEnumerable продукта, после чего я использую метод .ToList ().
источник
Объединить или объединить в списки в один список.
Есть одна вещь, которая должна быть правдой: тип обоих списков будет одинаковым.
Например : если у нас есть список,
string
мы можем добавить еще один список к существующему списку, у которого есть список строк типа, в противном случае мы не можем.Пример :
источник
В особом случае: «Все элементы List1 переходят в новый List2»: (например, список строк)
В этом случае list2 генерируется со всеми элементами из list1.
источник
Вам нужно использовать операцию Concat
источник
Когда у вас есть несколько списков, но вы не знаете, сколько именно, используйте это:
listsOfProducts
содержит несколько списков, заполненных объектами.источник