একসাথে দুটি তালিকায় যোগদান করা


333

আমার কাছে টাইপ স্ট্রিংয়ের (বা অন্য কোনও ধরণের) দুটি তালিকা থাকলে দুটি তালিকায় যোগ দেওয়ার দ্রুত উপায় কী?

আদেশ একই থাকা উচিত। সদৃশগুলি সরানো উচিত (যদিও উভয় লিঙ্কের প্রতিটি আইটেমই স্বতন্ত্র)। গুগল করার সময় আমি এগুলিতে খুব একটা পাইনি এবং সরবরাহের গতির জন্য কোনও নেট নেট ইন্টারফেস প্রয়োগ করতে চাইনি।


5
অর্ডার কি ব্যাপার? আপনি কি নকলগুলি ধরে রাখতে চান?
লার্সনাল

উত্তর:


573

আপনি চেষ্টা করতে পারেন:

List<string> a = new List<string>();
List<string> b = new List<string>();

a.AddRange(b);

জন্য এমএসডিএন পৃষ্ঠা AddRange

এই তালিকার ক্রম অপরিবর্তিত, কিন্তু এটা কোন সদৃশ যা মুছে যায় না Unionকরতে হবে।

এটি তালিকা পরিবর্তন করে a। যদি আপনি মূল তালিকাগুলি সংরক্ষণ করতে চান তবে আপনার ব্যবহার করা উচিত Concat(অন্যান্য উত্তরে উল্লেখ করা হয়েছে):

var newList = a.Concat(b);

এটি IEnumerableযতক্ষণ aনাল নয় ততক্ষণ প্রদান করে ।


27
কখন যে পদ্ধতিটি ব্যবহার করবেন তা সত্যিকার অর্থে কেউ প্রবেশ করেনি। অ্যাডরেঞ্জ এটিকে দ্বিতীয় তালিকায় যুক্ত করে একটি তালিকা সম্পাদনা করে (যেন আপনি ডেকেছেন। কনক্যাট এবং ইউনিয়ন এক্সটেনশন পদ্ধতিগুলি মূল তালিকাটি পরিবর্তন করে না। তারা অলসভাবে একটি নতুন আইনিউমারবল নির্মাণ করে এবং প্রয়োজনীয় তালিকা ছাড়াও মূল তালিকা সদস্যদের অ্যাক্সেস করতে পারে না। যেমন উল্লেখ করা হয়েছে, ইউনিয়ন সদৃশগুলি অপসারণ করে অন্যরা তা না করে।
শানফুমো

4
কেউ কি জানেন যে এই পদ্ধতির জটিলতা কী? (এটা এত লজ্জার বিষয় যে মাইক্রোসফ্ট তাদের এমএসডিএন এর অংশ হিসাবে এই গুরুত্বপূর্ণ তথ্য সরবরাহ করে না)
জ্যাকব

2
আমি আপনাকে বিভিন্ন পদ্ধতির এই ভাল তুলনা পরীক্ষা করার পরামর্শ দিই। বিভিন্ন বিকল্পের কিছু পারফরম্যান্স বিশ্লেষণও দেখান: সংগ্রহগুলি মার্জ
BogeyMan 15'19

এটি পুরোপুরি কাজ করে। অর্ধ মিলিয়নেরও বেশি আইটেমের উপর কনক্যাট () ব্যবহার করা হয়েছিল, যা বেশ কয়েক মিনিট সময় নেয়। এই পদ্ধতির 5 সেকেন্ডেরও কম সময় লাগে।
গ্রীনফেরেট 95

111

সর্বনিম্ন স্পেস ওভারহেড সহ উপায় হ'ল কনক্যাট এক্সটেনশন পদ্ধতিটি ব্যবহার করা।

var combined = list1.Concat(list2);

এটি এমন একটি উদাহরণ তৈরি করে IEnumerable<T>যা তালিকায় 1 এবং list2 এর উপাদানগুলিকে সেই ক্রমে গণনা করবে।


2
using System.Linq;কনক্যাট
টোথামারিও

43

ইউনিয়ন পদ্ধতি আপনার চাহিদা মোকাবেলার পারে। অর্ডার বা সদৃশ গুরুত্বপূর্ণ কিনা তা আপনি নির্দিষ্ট করেন নি।

দুটি আইনিম্যারেবল নিন এবং এখানে দেখা হিসাবে একটি ইউনিয়ন সম্পাদন করুন:

int[] ints1 = { 5, 3, 9, 7, 5, 9, 3, 7 };
int[] ints2 = { 8, 3, 6, 4, 4, 9, 1, 0 };

IEnumerable<int> union = ints1.Union(ints2);

// yields { 5, 3, 9, 7, 8, 6, 4, 1, 0 } 

24

এটার মতো কিছু:

firstList.AddRange (secondList);

অথবা, আপনি 'ইউনিয়ন' এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন যা সিস্টেম.লিংক-এ সংজ্ঞায়িত হয়েছে। 'ইউনিয়ন' এর সাহায্যে আপনি একটি তুলনাকারীও নির্দিষ্ট করতে পারেন, যা কোনও আইটেমকে ইউনিয়ন করা উচিত কিনা তা নির্দিষ্ট করতে ব্যবহার করতে পারেন।

এটার মত:

List<int> one = new List<int> { 1, 2, 3, 4, 5 };
List<int> second=new List<int> { 1, 2, 5, 6 };

var result = one.Union (second, new EqComparer ());

foreach( int x in result )
{
    Console.WriteLine (x);
}
Console.ReadLine ();

#region IEqualityComparer<int> Members
public class EqComparer : IEqualityComparer<int>
{
    public bool Equals( int x, int y )
    {
        return x == y;
    }

    public int GetHashCode( int obj )
    {
        return obj.GetHashCode ();
    }
}
#endregion

17
targetList = list1.Concat(list2).ToList();

এটা ঠিক মত কাজ করে আমি তাই মনে করি। যেমন আগেই বলা হয়েছিল, কনক্যাট একটি নতুন সিকোয়েন্স দেয় এবং ফলাফলকে তালিকায় রূপান্তর করার সময়, এটি পুরোপুরি কাজ করে। অ্যাডরেঞ্জ পদ্ধতি ব্যবহার করার সময় অন্তর্নিহিত রূপান্তরগুলি ব্যর্থ হতে পারে।


13

উভয় তালিকায় যদি কিছু আইটেম (গুলি) উপস্থিত থাকে তবে আপনি ব্যবহার করতে পারেন

var all = list1.Concat(list2).Concat(list3) ... Concat(listN).Distinct().ToList();

7

যতক্ষণ না তারা একই ধরণের হয়, অ্যাডরেঞ্জের মাধ্যমে এটি খুব সহজ:

list2.AddRange(list1);

7
var bigList = new List<int> { 1, 2, 3 }
    .Concat(new List<int> { 4, 5, 6 })
    .ToList(); /// yields { 1, 2, 3, 4, 5, 6 }

আমিও এটি পছন্দ করি খুব সহজ. ধন্যবাদ।
গুর্দীপস

আমি এটি পছন্দ করি কারণ এটি কোনও তালিকার পরিবর্তন করে না।
ইভ।


4
List<string> list1 = new List<string>();
list1.Add("dot");
list1.Add("net");

List<string> list2 = new List<string>();
list2.Add("pearls");
list2.Add("!");

var result = list1.Concat(list2);


2

একটি উপায়, আমি উল্লেখ করে দেখিনি যে এটি কিছুটা দৃ more় হতে পারে, বিশেষত যদি আপনি প্রতিটি উপাদানকে কোনও উপায়ে পরিবর্তন করতে চান (যেমন আপনি .Trim()সমস্ত উপাদানকে চেয়েছিলেন) ।

List<string> a = new List<string>();
List<string> b = new List<string>();
// ...
b.ForEach(x=>a.Add(x.Trim()));

1

এই লিঙ্কটি দেখুন

public class ProductA
{ 
public string Name { get; set; }
public int Code { get; set; }
}

public class ProductComparer : IEqualityComparer<ProductA>
{

public bool Equals(ProductA x, ProductA y)
{
    //Check whether the objects are the same object. 
    if (Object.ReferenceEquals(x, y)) return true;

    //Check whether the products' properties are equal. 
    return x != null && y != null && x.Code.Equals(y.Code) && x.Name.Equals(y.Name);
    }

public int GetHashCode(ProductA obj)
{
    //Get hash code for the Name field if it is not null. 
    int hashProductName = obj.Name == null ? 0 : obj.Name.GetHashCode();

    //Get hash code for the Code field. 
    int hashProductCode = obj.Code.GetHashCode();

    //Calculate the hash code for the product. 
    return hashProductName ^ hashProductCode;
}
}


    ProductA[] store1 = { new ProductA { Name = "apple", Code = 9 }, 
                   new ProductA { Name = "orange", Code = 4 } };

    ProductA[] store2 = { new ProductA { Name = "apple", Code = 9 }, 
                   new ProductA { Name = "lemon", Code = 12 } };

// উভয় অ্যারে থেকে পণ্য পান // ডুপ্লিকেট ব্যতীত।

IEnumerable<ProductA> union =
  store1.Union(store2);

foreach (var product in union)
    Console.WriteLine(product.Name + " " + product.Code);

/*
    This code produces the following output:

    apple 9
    orange 4
    lemon 12
*/

1

আমি যে দুটি বিকল্প ব্যবহার করি তা হ'ল:

list1.AddRange(list2);

অথবা

list1.Concat(list2);

তবে আমি লক্ষ্য করেছি যে আমি যখন AddRangeপুনরাবিস্মরণীয় ফাংশনটির সাথে এই পদ্ধতিটি ব্যবহার করি তখন নিজেকে প্রায়শই কল করে আমি একটি সিস্টেমআউটআফ মেমরিএক্সসেপশন পেয়েছি কারণ সর্বাধিক মাত্রার মাত্রা পৌঁছেছিল।

(গুগল অনুবাদিত বার্তা)
অ্যারে মাত্রা সমর্থিত ব্যাপ্তি ছাড়িয়েছে।

Concatসমস্যা সমাধান করা ব্যবহার করে ।


0

আমি কেবল পরীক্ষা করতে চেয়েছিলাম কীভাবে Unionরেফারেন্স ধরণের অবজেক্টগুলির ওভারল্যাপিং সংগ্রহের ক্ষেত্রে ডিফল্ট তুলকতার সাথে কাজ করে।

আমার উদ্দেশ্য হ'ল:

class MyInt
{
    public int val;

    public override string ToString()
    {
        return val.ToString();
    }
}

আমার পরীক্ষার কোডটি হ'ল:

MyInt[] myInts1 = new MyInt[10];
MyInt[] myInts2 = new MyInt[10];
int overlapFrom = 4;
Console.WriteLine("overlapFrom: {0}", overlapFrom);

Action<IEnumerable<MyInt>, string> printMyInts = (myInts, myIntsName) => Console.WriteLine("{2} ({0}): {1}", myInts.Count(), string.Join(" ", myInts), myIntsName);

for (int i = 0; i < myInts1.Length; i++)
    myInts1[i] = new MyInt { val = i };
printMyInts(myInts1, nameof(myInts1));

int j = 0;
for (; j + overlapFrom < myInts1.Length; j++)
    myInts2[j] = myInts1[j + overlapFrom];
for (; j < myInts2.Length; j++)
    myInts2[j] = new MyInt { val = j + overlapFrom };
printMyInts(myInts2, nameof(myInts2));

IEnumerable<MyInt> myUnion = myInts1.Union(myInts2);
printMyInts(myUnion, nameof(myUnion));

for (int i = 0; i < myInts2.Length; i++)
    myInts2[i].val += 10;
printMyInts(myInts2, nameof(myInts2));
printMyInts(myUnion, nameof(myUnion));

for (int i = 0; i < myInts1.Length; i++)
    myInts1[i].val = i;
printMyInts(myInts1, nameof(myInts1));
printMyInts(myUnion, nameof(myUnion));

আউটপুটটি হ'ল:

overlapFrom: 4
myInts1 (10): 0 1 2 3 4 5 6 7 8 9
myInts2 (10): 4 5 6 7 8 9 10 11 12 13
myUnion (14): 0 1 2 3 4 5 6 7 8 9 10 11 12 13
myInts2 (10): 14 15 16 17 18 19 20 21 22 23
myUnion (14): 0 1 2 3 14 15 16 17 18 19 20 21 22 23
myInts1 (10): 0 1 2 3 4 5 6 7 8 9
myUnion (14): 0 1 2 3 4 5 6 7 8 9 20 21 22 23

সুতরাং, সবকিছু ঠিকঠাক কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.