it-swarm.com.de

Fügen Sie in C # .NET zwei (oder mehr) Listen zu einer zusammen

Ist es möglich, zwei oder mehr Listen in .NET mithilfe von C # in eine einzige Liste zu konvertieren?

Zum Beispiel, 

public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);
187
zekia

Sie können die Methoden LINQ Concat und ToList verwenden:

var allProducts = productCollection1.Concat(productCollection2)
                                    .Concat(productCollection3)
                                    .ToList();

Beachten Sie, dass es effizientere Möglichkeiten gibt, dies zu tun - das Obige durchläuft im Wesentlichen alle Einträge und erstellt einen Puffer mit dynamischer Größe. Da Sie die Größe vorhersagen können, benötigen Sie diese dynamische Größe nicht. Sie können also verwenden :

var allProducts = new List<Product>(productCollection1.Count +
                                    productCollection2.Count +
                                    productCollection3.Count);
allProducts.AddRange(productCollection1);
allProducts.AddRange(productCollection2);
allProducts.AddRange(productCollection3);

(AddRange wurde aus Effizienzgründen speziell für ICollection<T> entwickelt.)

Ich würde diesen Ansatz nur wählen, wenn Sie es wirklich müssen.

395
Jon Skeet

Angenommen, Sie möchten eine Liste mit all der Produkte für die angegebenen Kategorie-Ids, können Sie Ihre Abfrage als Projektion behandeln, gefolgt von einer Abflachung-Operation. Es gibt einen LINQ-Operator, der das tut: SelectMany .

// implicitly List<Product>
var products = new[] { CategoryId1, CategoryId2, CategoryId3 }
                     .SelectMany(id => GetAllProducts(id))
                     .ToList();

In C # 4 können Sie SelectMany folgendermaßen verkürzen: .SelectMany(GetAllProducts)

Wenn Sie bereits Listen für die Produkte für jede ID haben, benötigen Sie eine Verkettung, wie andere darauf hinweisen.

36
Ani

sie können sie mit LINQ kombinieren:

  list = list1.Concat(list2).Concat(list3).ToList();

der traditionellere Ansatz der Verwendung von List.AddRange() ist möglicherweise effizienter.

21
Botz3000

Sie können die Methode Concat extension verwenden:

var result = productCollection1
    .Concat(productCollection2)
    .Concat(productCollection3)
    .ToList();
7
Darin Dimitrov
list4 = list1.Concat(list2).Concat(list3).ToList();
7
decyclone

Werfen Sie einen Blick auf List.AddRange , um Listen zusammenzuführen

7
StuartLC

Ich habe es bereits kommentiert, denke aber immer noch, dass es eine gültige Option ist. Testen Sie einfach, ob in Ihrer Umgebung die eine oder andere Lösung besser ist. In meinem speziellen Fall ist die Verwendung von source.ForEach(p => dest.Add(p)) besser als die klassische AddRange, aber ich habe nicht untersucht, warum auf niedrigem Niveau.

Einen Beispielcode finden Sie hier: https://Gist.github.com/mcliment/4690433

Die Option wäre also:

var allProducts = new List<Product>(productCollection1.Count +
                                    productCollection2.Count +
                                    productCollection3.Count);

productCollection1.ForEach(p => allProducts.Add(p));
productCollection2.ForEach(p => allProducts.Add(p));
productCollection3.ForEach(p => allProducts.Add(p));

Testen Sie es, um zu sehen, ob es für Sie funktioniert.

Disclaimer: Ich befürworte diese Lösung nicht, ich finde Concat am klarsten. Ich habe gerade in meiner Diskussion mit Jon gesagt, dass dieser Fall in meiner Maschine besser ist als AddRange, aber er sagt mit weit mehr Wissen als ich, dass dies keinen Sinn macht. Es gibt den Gist, wenn Sie vergleichen wollen.

2
Marc Climent

Ich weiß, das ist eine alte Frage, von der ich dachte, ich könnte nur meine zwei Cents hinzufügen.

Wenn Sie einen List<Something>[] haben, können Sie ihnen mit Aggregate beitreten.

public List<TType> Concat<TType>(params List<TType>[] lists)
{
    var result = lists.Aggregate(new List<TType>(), (x, y) => x.Concat(y).ToList());

    return result;
}

Hoffe das hilft.

1
sQuir3l
// I would make it a little bit more simple

 var products = new List<List<product>> {item1, item2, item3 }.SelectMany(id => id).ToList();

Auf diese Weise handelt es sich um eine mehrdimensionale Liste, die von .SelectMany () in ein IEnumerable-Produkt abgeflacht wird, danach verwende ich die .ToList () -Methode.

1
Gringo Jaimes

Im Sonderfall: "Alle Elemente von List1 gehen auf eine neue List2": (z. B. eine Stringliste)

List<string> list2 = new List<string>(list1);

In diesem Fall wird list2 mit allen Elementen aus list1 generiert.

0
Arthur Zennig

Zusammenführen oder Kombinieren zu Listen zu einer Liste.

  • Eines muss wahr sein: Der Typ beider Listen ist Gleich.

  • Zum Beispiel : Wenn wir eine Liste von string haben, können wir der Vorhandenen Liste eine weitere Liste hinzufügen, die eine Liste des Typs string hat, andernfalls können wir keine.

Beispiel :

class Program
{
   static void Main(string[] args)
   {
      List<string> CustomerList_One = new List<string> 
      {
         "James",
         "Scott",
         "Mark",
         "John",
         "Sara",
         "Mary",
         "William",
         "Broad",
         "Ben",
         "Rich",
         "Hack",
         "Bob"
      };

      List<string> CustomerList_Two = new List<string> 
      {
         "Perter",
         "Parker",
         "Bond",
         "been",
         "Bilbo",
         "Cooper"
      };

      // Adding all contents of CustomerList_Two to CustomerList_One.
      CustomerList_One.AddRange(CustomerList_Two);

      // Creating another Listlist and assigning all Contents of CustomerList_One.
      List<string> AllCustomers = new List<string>();

      foreach (var item in CustomerList_One)
      {
         AllCustomers.Add(item);
      }

      // Removing CustomerList_One & CustomerList_Two.
      CustomerList_One = null;

      CustomerList_Two = null;
      // CustomerList_One & CustomerList_Two -- (Garbage Collected)
      GC.Collect();

      Console.WriteLine("Total No. of Customers : " +  AllCustomers.Count());
      Console.WriteLine("-------------------------------------------------");
      foreach (var customer in AllCustomers)
      {
         Console.WriteLine("Customer : " + customer);
      }
      Console.WriteLine("-------------------------------------------------");

   }
}
0
Rehan Shah

Sie müssen die Concat-Operation verwenden

0
Artem

Wenn Sie nur wenige Listen erhalten haben und nicht genau wissen, wie viele genau sind, verwenden Sie Folgendes:

listsOfProducts enthält einige Listen mit Objekten.

List<Product> productListMerged = new List<Product>();

listsOfProducts.ForEach(q => q.ForEach(e => productListMerged.Add(e)));
0
john.kernel