সি # .নেটে দুটি (বা আরও বেশি) তালিকা একত্রিত করুন


246

সি # ব্যবহার করে .NET- তে দু'এরও বেশি তালিকাকে একটি একক তালিকায় রূপান্তর করা সম্ভব?

উদাহরণ স্বরূপ,

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

আপনি কি পণ্য সংগ্রহ 2 এবং 3 একত্রিত করতে চান?

আপনি কি এক তালিকায় একাধিক তালিকাকে একীভূত করতে চান?
আমর বাদোয়া

আপনার উদাহরণ আমাকে বিভ্রান্ত করছে ... আপনি কি AddRangeমেথোডের সন্ধান করছেন?
ববি

উত্তর:


457

আপনি লাইনকিউ Concatএবং ToListপদ্ধতিগুলি ব্যবহার করতে পারেন :

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

মনে রাখবেন এটি করার আরও কার্যকরী উপায় রয়েছে - উপরেরগুলি মূলত সমস্ত এন্ট্রিগুলিকে লুপ করবে এবং একটি গতিশীল আকারের বাফার তৈরি করবে। আপনি যে আকারটি দিয়ে শুরু করতে পারবেন তার পূর্বাভাস হিসাবে, আপনার এই গতিশীল আকারের দরকার নেই ... যাতে আপনি ব্যবহার করতে পারেন:

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

( দক্ষতার AddRangeজন্য বিশেষ ICollection<T>ক্ষেত্রেযুক্ত।)

আপনি সত্যিই যদিও না করা না হলে আমি এই পদ্ধতির গ্রহণ করব না।


4
BTW, productCollection1.ForEach(p => allProducts.Add(p))AddRange চেয়ে বেশি performant হয়।
মার্ক ক্লায়েন্ট

8
@ মার্কক্লেমেন্ট: এটি একটি মোটামুটি কম্বল স্টেটমেন্ট - বিশেষত AddRangeএকটি অন্তর্নিহিত অ্যারে থেকে অন্যটিতে একটি ব্লক অনুলিপি করতে হয়। এর প্রমাণের জন্য আপনার কি কোনও লিঙ্ক আছে?
জন স্কিটি

4
@ মার্কক্লেমেন্ট: এক্ষেত্রে ভাল, আপনার পরীক্ষায় আপনি সঠিক চূড়ান্ত আকারের সাথে তালিকাটি তৈরি করছেন না - যেখানে আমার উত্তরের কোডটি করে। এটি করুন, এবং 10000 * 10000 পরীক্ষা অ্যাড্রেঞ্জ ব্যবহার করে দ্রুততর হয়, কমপক্ষে - যদিও অন্যান্য ফলাফল অসঙ্গত। (আপনাকে পরীক্ষার মধ্যে জঞ্জাল সংগ্রহের জন্যও জোর করা উচিত - এবং আমি যুক্তি দেব যে খুব ছোট পরীক্ষাগুলি অর্থহীনভাবে ছোট।)
জোন স্কিট

6
@ মার্কক্লেমেন্ট: কোন বিশেষ মামলা? কোন সিএলআর? কোন সিপিইউ আর্কিটেকচার? আমার মেশিনে আমি ফলাফলের মিশ্রণ পাই। এ কারণেই আমি productionCollection1.ForEach(...)"বিটিডাব্লু, অ্যাডরেঞ্জের চেয়ে আরও বেশি পারফরম্যান্স " এর মতো কম্বল স্টেটমেন্টগুলিকে স্বীকার / গ্রহণ করতে ঘৃণা করি । পারফরম্যান্স খুব সহজেই এত সহজে বর্ণিত হয়। আমি আশ্চর্য হয়েছি যে অ্যাডরেঞ্জ এটিকে হাততালি মারছে না - আমাকে আরও তদন্ত করা দরকার to
জন স্কিটি

15
আমি সারাংশ আপডেট করেছি (বেনমার্কসডটনেট ব্যবহার করে পারফরম্যান্স টেস্টের সাহায্যে গিস্টটি gist.github.com/mcliment/4690433 ) এবং যথাযথভাবে পরীক্ষিত, AddRangeকাঁচা গতির জন্য সেরা বিকল্প (প্রায় 4x এবং বৃহত তালিকা আরও ভাল বৃদ্ধি করা), জনের মতো suggeste।
মার্ক ক্লাইমেট

41

ধরে নেওয়া হচ্ছে যে আপনি নির্দিষ্ট ক্যাটাগরি-আইডির জন্য সমস্ত পণ্য সমন্বিত একটি তালিকা চান , আপনি আপনার ক্যোয়ারীটিকে সমতলকরণ ক্রিয়াকলাপের পরে প্রক্ষেপণ হিসাবে বিবেচনা করতে পারেন । একটা LINQ অপারেটর যে আছে করছে: ।SelectMany

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

সি # 4 এ আপনি সিলেক্টম্যানিকে সংক্ষিপ্ত করতে পারেন: .SelectMany(GetAllProducts)

আপনার যদি ইতিমধ্যে প্রতিটি আইডির জন্য পণ্যগুলি উপস্থাপনের তালিকা থাকে তবে অন্যদের উল্লেখ করার মতো আপনার যা দরকার তা একটি কনটেন্টেশন is


8
যদি অন্য কোনও কারণে ওপিকে পৃথক তালিকার প্রয়োজন না হয় তবে এটি দুর্দান্ত সমাধান।
জন স্কিটি

2
একটি অনুরূপ সমস্যা হচ্ছে এবং যখন আমি এটি পেয়েছিলাম তখন একটি প্রশ্ন ছেড়ে দিতে এবং পোস্ট করতে চলেছিলাম। এটি সেরা উত্তর। বিশেষত যদি কোডটির ইতিমধ্যে একটি তালিকা বা অ্যারেতে এই বিভাগগুলি থাকে তবে আমার ক্ষেত্রে এটি সত্য ছিল।

22

আপনি লিনকিউ ব্যবহার করে এগুলি একত্রিত করতে পারেন:

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

ব্যবহারের আরও traditionalতিহ্যগত পদ্ধতির List.AddRange()যদিও আরও দক্ষ হতে পারে।





4

আমি জানি এটি একটি পুরানো প্রশ্ন আমি ভেবেছিলাম আমি কেবল আমার 2 সেন্ট যোগ করতে পারি।

আপনার যদি একটি থাকে তবে List<Something>[]আপনি তাদের ব্যবহার করে যোগ দিতে পারেনAggregate

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

    return result;
}

আশাকরি এটা সাহায্য করবে.


2

আমি ইতিমধ্যে এটি মন্তব্য করেছি তবে আমি এখনও মনে করি এটি একটি বৈধ বিকল্প, আপনার পরিবেশে যদি একটি সমাধান বা অন্যটি হয় তবে এটি পরীক্ষা করুন test আমার বিশেষ ক্ষেত্রে, source.ForEach(p => dest.Add(p))ক্লাসিকের চেয়ে ভাল পারফরম্যান্স ব্যবহার করে AddRangeতবে আমি নিম্ন স্তরে কেন তদন্ত করেছি।

আপনি এখানে উদাহরণ কোড দেখতে পারেন: https://gist.github.com/mcliment/4690433

সুতরাং বিকল্পটি হবে:

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));

এটি আপনার পক্ষে কাজ করে কিনা তা পরীক্ষা করে দেখুন।

দাবি অস্বীকার : আমি এই সমাধানের পক্ষে পরামর্শ দিচ্ছি না, আমি Concatসর্বাধিক স্পষ্ট একটি খুঁজে পাই । আমি জোন-এর সাথে আমার আলোচনার মধ্যেই বলেছি- আমার মেশিনে এই ক্ষেত্রেটি আরও ভাল পারফর্ম করে AddRangeতবে তিনি বলেছিলেন, আমার চেয়ে অনেক বেশি জ্ঞান দিয়ে, এটি যে কোনও অর্থবোধ করে না। আপনি যদি তুলনা করতে চান তবে সংক্ষিপ্তসার আছে।


মন্তব্যে জন স্কিটির সাথে আপনার বিতর্ক নির্বিশেষে, আমি তার প্রস্তাবিত সমাধানটির দ্বারা প্রদত্ত পরিচ্ছন্নতাকে বেশি পছন্দ করি, এটি কোডের অভিপ্রায় হিসাবে অপ্রয়োজনীয় ব্যাখ্যা যুক্ত করে।
ভিক্স

1
আমি মনে করি সবচেয়ে স্পষ্ট বিকল্প হ'ল অ্যাডরেঞ্জের সাধারণীকরণ হিসাবে কনক্যাট, শব্দার্থগতভাবে আরও সঠিক এবং এটি তালিকায় স্থান পরিবর্তন করে না যা এটি শৃঙ্খলাবদ্ধ করে তোলে। জনের সাথে আলোচনাটি ছিল পরিচ্ছন্নতার নয়, পারফরম্যান্সের বিষয়ে।
মার্ক ক্লাইমেন্ট

আমার এর মতো কিছু রয়েছে: var allProducts = lstName.Concat(lstCMSID) .Concat(lstSpecialtyPhys) .ToList();যা এটি গ্রিডভিউতে যুক্ত করেছে তবে একটি কলাম হিসাবে। আমি তাদের তিনটি পৃথক কলামে বিভক্ত করতে চাই।
Si8

2
// I would make it a little bit more simple

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

এইভাবে এটি একটি বহুমাত্রিক তালিকা এবং .SelectMany () এটিকে পণ্যটির একটি মূল পরিমাণে সমতল করবে তারপরে আমি .ToList () পদ্ধতিটি ব্যবহার করি।


2

এক তালিকায় একত্রিত বা সংযোজন তালিকাগুলিতে।

  • একটি জিনিস অবশ্যই সত্য হতে হবে: উভয় তালিকার ধরণ সমান হবে।

  • উদাহরণস্বরূপ : যদি আমাদের তালিকা থাকে তবে আমরা stringবিদ্যমান তালিকায় অন্য তালিকা যুক্ত করতে পারি যা টাইপ স্ট্রিংয়ের তালিকা রয়েছে অন্যথায় আমরা পারি না।

উদাহরণ :

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("-------------------------------------------------");

   }
}

1

বিশেষ ক্ষেত্রে: "তালিকা 1 এর সমস্ত উপাদান একটি নতুন তালিকা 2 এ যায়": (উদাহরণস্বরূপ একটি স্ট্রিং তালিকা)

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

এই ক্ষেত্রে তালিকার তালিকা তালিকা 1 থেকে সমস্ত উপাদান সহ উত্পন্ন হয়।


0

আপনার কনক্যাট অপারেশন ব্যবহার করা দরকার


0

যখন আপনি কয়েকটি তালিকা পেয়েছেন তবে ঠিক কতগুলি জানেন না, এটি ব্যবহার করুন:

listsOfProducts অবজেক্টে ভরা কয়েকটি তালিকা রয়েছে।

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

listsOfProducts.ForEach(q => q.ForEach(e => productListMerged.Add(e)));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.