# # নেট এ বিদ্যমান অ্যারেতে নতুন আইটেম যুক্ত করুন


134

সি # .নেটে বিদ্যমান স্ট্রিং অ্যারেটিতে কীভাবে নতুন আইটেম যুক্ত করবেন?

আমার বিদ্যমান ডাটা সংরক্ষণ করতে হবে।

উত্তর:


121

আপনার যদি গতিশীল আকারের অ্যারে প্রয়োজন হয় তবে আমি একটি তালিকা ব্যবহার করব:

List<string> ls = new List<string>();
ls.Add("Hello");

27
এবং প্রয়োজনে ls.ToArray () শেষে করুন
নারায়ণ

2
প্রশ্নে জিজ্ঞাসা করা ছাড়া অন্য কোনও মেকানিক ব্যবহার করা কোনও উত্তর নয়।
ব্যবহারকারী 11909

@ ব্যবহারকারী2190035: আপনি কোথায় এই ধারণা পেয়েছেন তা নিশ্চিত নন এবং 111 জন ব্যক্তি যারা আপত্তি জানিয়েছেন তারা আপনার সাথে একমত নন। যদি আপনি কোনও অ্যারের প্রসারণের আরও ভাল উপায় সম্পর্কে জানেন তবে সব উপায়ে পোস্ট করুন। আমি সন্দেহ করি যে আপনার পুনঃ-বরাদ্দ এবং ম্যানুয়াল অনুলিপি যদিও কোনও তালিকা ব্যবহারের চেয়ে ভাল হবে। কখনও কখনও উত্তর হয় "এটি করবেন না।"
এড এস

@ এডিএস. প্রশ্নটি ছিল, কীভাবে বিদ্যমান স্ট্রিং অ্যারেতে কোনও আইটেম যুক্ত করা যায় , তবে এই উত্তরটির কোনও বিন্যাস নেই, পরিবর্তে এটি একটি নতুন তালিকা তৈরি করে <>। আমার অ্যাপ্লিকেশনটিতে, আমি টাইপটি তালিকা <> তে পরিবর্তন করতে পারছি না, সুতরাং আমাকে একটি অ্যারের আকার পরিবর্তন করতে হবে (একটি অনুলিপি তৈরি করা হচ্ছে ...)। আলী এরেসের উত্তর আমাকে সাহায্য করেছিল।
ব্যবহারকারী 11909

@ ব্যবহারকারী2190035: অনুমানযোগ্য <টি>। টোআর্রে ()। আমি প্রতিদিন সি # লিখি এবং এর আগে আমাকে আর কখনও আকার দিতে হয়নি।
এড এস

100

এটি একটি সমাধান হতে পারে;

Array.Resize(ref array, newsize);
array[newsize - 1] = "newvalue"

তবে গতিশীল আকারের অ্যারের জন্য আমি তালিকাটিও পছন্দ করব।


@ কনরাড, এটি অবশ্যই অ্যারের মধ্যে ডেটা সংরক্ষণ করবে।
আলী এরেসেজ

1
এটি অনুরোধ করা কিছু সময়ের জন্য উপযুক্ত নয়। কারণ 'পুনরায় আকার' ফাংশনটির বিশাল পারফরম্যান্স রয়েছে। এক বা দু'বারের জন্য বাগ, এটি খুব ভাল।
বিজ্ঞাপন

53

লিনকিউ ব্যবহার:

arr = (arr ?? Enumerable.Empty<string>()).Concat(new[] { newitem }).ToArray();

আমি এটি ব্যবহার করতে পছন্দ করি কারণ এটি ওয়ান-লাইনার এবং একটি স্যুইচ স্টেটমেন্ট এম্বেড করার পক্ষে খুব সহজ, যদি একটি সরল if-বিবৃতি, বা যুক্তি হিসাবে পাস হয়।

সম্পাদনা করুন:

কিছু লোক পছন্দ করেন না new[] { newitem }কারণ এটি একটি ছোট, এক-আইটেম, অস্থায়ী অ্যারে তৈরি করে। এখানে এমন একটি সংস্করণ ব্যবহার করা হচ্ছে Enumerable.Repeatযাতে কোনও বস্তু তৈরি করার প্রয়োজন হয় না (কমপক্ষে তলদেশে নয় -। নেট পুনরাবৃত্তি সম্ভবত টেবিলের নীচে রাজ্য মেশিন অবজেক্টগুলির একটি গুচ্ছ তৈরি করে)।

arr = (arr ?? Enumerable.Empty<string>()).Concat(Enumerable.Repeat(newitem,1)).ToArray();

এবং আপনি যদি নিশ্চিত হন যে অ্যারেটি কখনই nullশুরু হবে না , আপনি এটিকে সহজ করতে পারবেন:

arr.Concat(Enumerable.Repeat(newitem,1)).ToArray();

লক্ষ্য করুন যে আপনি যদি কোনও অর্ডারযুক্ত সংগ্রহে আইটেমগুলি যুক্ত করতে চান তবে Listসম্ভবত এটি আপনি চান ডেটা কাঠামো, শুরু করার জন্য অ্যারে নয়।


1
খুব সুন্দর +1। জেনেরিক এক্সটেনশন পদ্ধতি হিসাবে আমার অনুরূপ কোড রয়েছে। : আমি এই উত্তর কোড অন্তর্ভুক্ত করেছেন stackoverflow.com/a/11035286/673545
dblood

"সি # তে কোডের একটি লাইনে একটি অ্যারেতে কীভাবে সংযুক্ত করা যায়" এটি অনুসন্ধান করা সত্ত্বেও এটি খুব দরকারী - আশা করি এই মন্তব্যটি পরের বার আবার এটির জন্য যথেষ্ট।
গ্যারি

28

খুব পুরানো প্রশ্ন, তবে এখনও এটি যুক্ত করতে চেয়েছিলেন।

যদি আপনি ওয়ান-লাইনার সন্ধান করে থাকেন তবে আপনি নীচের কোডটি ব্যবহার করতে পারেন। এটি তালিকার কনস্ট্রাক্টরকে একত্রিত করে যা একটি গণনাকারী এবং "নতুন" (যেহেতু প্রশ্ন উত্থাপিত হয়েছিল) ইনিশিয়ালাইজার সিনট্যাক্স গ্রহণ করে।

myArray = new List<string>(myArray) { "add this" }.ToArray();

27

C # অ্যারেগুলির অপরিবর্তনীয় হয় , যেমন string[], int[]। এর অর্থ আপনি তাদের পুনরায় আকার দিতে পারবেন না। আপনার একদম নতুন অ্যারে তৈরি করা দরকার।

অ্যারের জন্য কোডটি এখানে রয়েছে es পুনরায় আকার দিন :

public static void Resize<T>(ref T[] array, int newSize)
{
    if (newSize < 0)
    {
        throw new ArgumentOutOfRangeException("newSize", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
    }
    T[] sourceArray = array;
    if (sourceArray == null)
    {
        array = new T[newSize];
    }
    else if (sourceArray.Length != newSize)
    {
        T[] destinationArray = new T[newSize];
        Copy(sourceArray, 0, destinationArray, 0, (sourceArray.Length > newSize) ? newSize : sourceArray.Length);
        array = destinationArray;
    }
}

আপনি দেখতে পাচ্ছেন এটি নতুন আকারের সাথে একটি নতুন অ্যারে তৈরি করে, উত্স অ্যারের সামগ্রীটি অনুলিপি করে এবং নতুন অ্যারের রেফারেন্স সেট করে। এর জন্য ইঙ্গিতটি হ'ল প্রথম প্যারামিটারের রেফ কীওয়ার্ড।

এমন তালিকা রয়েছে যা নতুন আইটেমগুলির জন্য গতিশীলভাবে নতুন স্লট বরাদ্দ করতে পারে । এটি উদাহরণস্বরূপ <টি> তালিকা । এগুলিতে অপরিবর্তনীয় অ্যারে থাকে এবং যখন প্রয়োজন হয় তাদের পুনরায় আকার দিন (তালিকা <T> কোনও লিঙ্কযুক্ত তালিকার বাস্তবায়ন নয়!)। জেনারিকস ( অবজেক্ট অ্যারে সহ) অ্যারেলিস্ট একই জিনিস ।

লিঙ্কযুক্তলিস্ট <T> একটি বাস্তব লিঙ্কযুক্ত তালিকার বাস্তবায়ন implementation দুর্ভাগ্যক্রমে আপনি কেবলমাত্র লিঙ্কলিস্টনোড <T> উপাদানগুলিকে তালিকায় যুক্ত করতে পারেন, সুতরাং আপনাকে অবশ্যই নিজের তালিকা উপাদানগুলি এই নোডের মধ্যে আবদ্ধ করতে হবে। আমি মনে করি এটির ব্যবহার অস্বাভাবিক।


আমি মনে করি আপনি অ্যারে বলতে চাইছেন meant কপি
ব্যবহারকারী 123456

2
কেবল উত্তরটি কেন এটি সম্ভব নয় এবং কেবল একটি তালিকা ব্যবহারের পরামর্শ দেয় না তার জন্য কিছু তথ্য সরবরাহ করে ...
গিলাদ গ্রীন

আমি বিশ্বাস করি যে Aray.Resizeকোনও অ্যারের সামগ্রী বাদ না দিয়ে এটির আকার পরিবর্তন করতে পারে। ডকস.মাইক্রোসফট.ইন- ইউএস
ডটনেট /

25
 Array.Resize(ref youur_array_name, your_array_name.Length + 1);
 your_array_name[your_array_name.Length - 1] = "new item";

7

জেনেরিক টাইপ ব্যবহার করে একটি এক্সটেনশন পদ্ধতি তৈরি করতে আপনি @ স্টিফেন চুং তার লিনকুই ভিত্তিক যুক্তি ব্যবহার করে প্রদত্ত জবাবটি প্রসারিত করতে পারেন।

public static class CollectionHelper
{
    public static IEnumerable<T> Add<T>(this IEnumerable<T> sequence, T item)
    {
        return (sequence ?? Enumerable.Empty<T>()).Concat(new[] { item });
    }

    public static T[] AddRangeToArray<T>(this T[] sequence, T[] items)
    {
        return (sequence ?? Enumerable.Empty<T>()).Concat(items).ToArray();
    }

    public static T[] AddToArray<T>(this T[] sequence, T item)
    {
        return Add(sequence, item).ToArray();
    }

}

তারপরে আপনি এটিকে সরাসরি অ্যারেতে কল করতে পারেন।

    public void AddToArray(string[] options)
    {
        // Add one item
        options = options.AddToArray("New Item");

        // Add a 
        options = options.AddRangeToArray(new string[] { "one", "two", "three" });

        // Do stuff...
    }

স্বীকারোক্তিভাবে, অ্যাডর্যাংটোআরে () পদ্ধতিটি আপনার কিছুটা ক্যানক্যাট () এর সাথে একই কার্যকারিতা রয়েছে বলে কিছুটা ওভারকিল বলে মনে হচ্ছে তবে এইভাবে শেষ কোডটি অ্যারের সাথে সরাসরি "বিপরীতে" কাজ করতে পারে:

options = options.Concat(new string[] { "one", "two", "three" }).ToArray();

আপনাকে ধন্যবাদ, এটি খুব সহায়ক ছিল, আমি একটি আইটেম সরানোর জন্য একটি বিকল্প যুক্ত করেছি (আমি আশা করি এটি আপনার সাথে ঠিক আছে)।
তাল শেগাল

@ ট্যালসেগাল আপনি স্বাগত, আমার আনন্দ। আপনি ফিট দেখতে কোডটি ব্যবহার করুন!
dblood

6

অ্যারেটিকে অপরিবর্তনীয় এবং স্থির আকারে রাখাই ভাল।

আপনি সিমুলেট করতে Addদ্বারা Extension MethodএবংIEnumerable.Concat()

public static class ArrayExtensions
    {
        public static string[] Add(this string[] array, string item)
        {
            return array.Concat(new[] {item}).ToArray();
        }
    }

5

আপনি যদি অ্যারে নিয়ে প্রচুর পরিশ্রম করছেন এবং কোনও কারণে তালিকাগুলি না করে থাকেন তবে এই জেনেরিক টাইপ করা রিটার্ন জেনেরিক পদ্ধতিটি Addসহায়তা করতে পারে

    public static T[] Add<T>(T[] array, T item)
    {
        T[] returnarray = new T[array.Length + 1];
        for (int i = 0; i < array.Length; i++)
        {
            returnarray[i] = array[i];
        }
        returnarray[array.Length] = item;
        return returnarray;
    }

4

সমস্ত প্রস্তাবিত উত্তর তারা যা বলে তা এড়াতে পছন্দ করে, একইভাবে একটি নতুন অ্যারে তৈরি করে এবং কেবলমাত্র আরও বেশি ওভারহেড হারিয়ে গেলে এটিতে একটি নতুন এন্ট্রি যুক্ত করে। লিনকুই ম্যাজিক নয়, টি-এর তালিকাটি কিছু অতিরিক্ত স্থান সহ একটি বাফার স্পেস সহ একটি অ্যারে যা আইটেমগুলি যুক্ত হওয়ার সাথে সাথে অভ্যন্তরীণ অ্যারের পুনরায় আকার এড়াতে পারে।

সমস্ত বিমূর্ততা একই সমস্যা সমাধান করতে হবে, খালি স্লট নেই এমন অ্যারে তৈরি করতে হবে যা সমস্ত মান রাখে এবং তাদের ফিরিয়ে দেয়।

আপনার যদি নমনীয়তার প্রয়োজন হয় তবে একটি যথেষ্ট পরিমাণে একটি তালিকা তৈরি করতে পারে যা আপনি পাস করতে পারেন তবে তা করুন that অন্যথায় একটি অ্যারে ব্যবহার করুন এবং সেই থ্রেড-সেফ অবজেক্টটি ভাগ করুন। এছাড়াও, নতুন স্প্যান চারপাশের তালিকাগুলি অনুলিপি না করে ডেটা ভাগ করতে সহায়তা করে।

প্রশ্নের উত্তর দিতে:

Array.Resize(ref myArray, myArray.Length + 1);
data[myArray.Length - 1] = Value;

4

সুতরাং আপনার যদি বিদ্যমান অ্যারে থাকে তবে আমার দ্রুত ঠিক হয়ে যাবে

var tempList = originalArray.ToList();
tempList.Add(newitem);

এখন কেবল নতুনটির সাথে মূল অ্যারেটি প্রতিস্থাপন করুন

originalArray = tempList.ToArray();

আমার সমাধানটি সমাধান করুন
প্রাগুয়ান

3

.NET ফ্রেমওয়ার্ক 4.7.1 এবং। নেট কোর 1.0 এর পর থেকে একটি নতুন Append<TSource>পদ্ধতি যুক্ত করা হয়েছে IEnumerable<TSource>

এটি কীভাবে ব্যবহার করবেন তা এখানে:

var numbers = new [] { "one", "two", "three" };
numbers = numbers.Append("four").ToArray();
Console.WriteLine(string.Join(", ", numbers)); // one, two, three, four

নোট করুন আপনি অ্যারের শুরুতে যদি উপাদানটি যুক্ত করতে চান তবে Prepend<TSource>পরিবর্তে আপনি নতুন পদ্ধতিটি ব্যবহার করতে পারেন ।


2

মেমরি পরিচালনার জন্য একটি তালিকা ব্যবহার করা আপনার সেরা বিকল্প হবে।


2

একটি এক্সটেনশন পদ্ধতি ব্যবহার সম্পর্কে কী? এই ক্ষেত্রে:

public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> source, TSource item)
{
    return source.Union(new TSource[] { item });
}

এই ক্ষেত্রে:

string[] sourceArray = new []
{
    "foo",
    "bar"
}
string additionalItem = "foobar";
string result = sourceArray.Union(additionalItem);

লিনকের ইউনিয়ন এক্সটেনশনের এই আচরণটিকে নকল করে দেখুন (দুটি নতুন অ্যারে একটি নতুনতে সংযুক্ত করার জন্য ব্যবহৃত হয়েছিল) এবং লিনক গ্রন্থাগারটি কাজ করতে হবে।


1

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


2
সৃষ্টিকর্তাকে ধন্যবাদ! অপব্যবহার করা হলে রিডিম অবিশ্বাস্যরকম ধীর হয়। =)
এড এস।

ReDim Preserveঅ্যারেটিকে কেবল একটি লেগারে অনুলিপি করে। কোনও অলৌকিক অ্যারে পুনরায় আকার নেই।
অলিভিয়ার জ্যাকট-ডেস্কোম্বেস 21


0
private static string[] GetMergedArray(string[] originalArray, string[] newArray)
    {
        int startIndexForNewArray = originalArray.Length;
        Array.Resize<string>(ref originalArray, originalArray.Length + newArray.Length);
        newArray.CopyTo(originalArray, startIndexForNewArray);
        return originalArray;
    }

0

স্ট্রিংবিল্ডার ক্লাসটি ব্যবহার করে কেন চেষ্টা করবেন না । এটিতে। সন্নিবেশ এবং .্যাপেন্ডের মতো পদ্ধতি রয়েছে। আপনি এখানে এটি সম্পর্কে আরও পড়তে পারেন: http://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.71).aspx


0

দুর্ভাগ্যক্রমে একটি তালিকা ব্যবহার করা সমস্ত পরিস্থিতিতে কাজ করবে না। একটি তালিকা এবং একটি অ্যারে আসলে আলাদা এবং 100% বিনিময়যোগ্য নয়। এটি পরিস্থিতিগুলির উপর নির্ভর করবে যদি এটি চারপাশে একটি গ্রহণযোগ্য কাজ হয়।


0

যেহেতু এই প্রশ্নটি প্রদত্ত উত্তরে সন্তুষ্ট নয়, তাই আমি এই উত্তরটি যুক্ত করতে চাই :)

public class CustomArrayList<T> 
 {  
   private T[] arr;  private int count;  

public int Count  
  {   
    get   
      {    
        return this.count;   
      }  
   }  
 private const int INITIAL_CAPACITY = 4;  

 public CustomArrayList(int capacity = INITIAL_CAPACITY) 
 {  
    this.arr = new T[capacity];   this.count = 0; 
  } 

 public void Add(T item) 
  {  
    GrowIfArrIsFull();  
   this.arr[this.count] = item;  this.count++; 
  }  

public void Insert(int index, T item) 
{  
 if (index > this.count || index < 0)  
    {   
      throw new IndexOutOfRangeException(    "Invalid index: " + index);  
     }  
     GrowIfArrIsFull();  
     Array.Copy(this.arr, index,   this.arr, index + 1, this.count - index);          
    this.arr[index] = item;  this.count++; }  

    private void GrowIfArrIsFull() 
    {  
    if (this.count + 1 > this.arr.Length)  
    {   
      T[] extendedArr = new T[this.arr.Length * 2];  
      Array.Copy(this.arr, extendedArr, this.count);  
      this.arr = extendedArr;  
    } 
  }
 }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.