সি # .নেটে বিদ্যমান স্ট্রিং অ্যারেটিতে কীভাবে নতুন আইটেম যুক্ত করবেন?
আমার বিদ্যমান ডাটা সংরক্ষণ করতে হবে।
সি # .নেটে বিদ্যমান স্ট্রিং অ্যারেটিতে কীভাবে নতুন আইটেম যুক্ত করবেন?
আমার বিদ্যমান ডাটা সংরক্ষণ করতে হবে।
উত্তর:
আপনার যদি গতিশীল আকারের অ্যারে প্রয়োজন হয় তবে আমি একটি তালিকা ব্যবহার করব:
List<string> ls = new List<string>();
ls.Add("Hello");
এটি একটি সমাধান হতে পারে;
Array.Resize(ref array, newsize);
array[newsize - 1] = "newvalue"
তবে গতিশীল আকারের অ্যারের জন্য আমি তালিকাটিও পছন্দ করব।
লিনকিউ ব্যবহার:
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সম্ভবত এটি আপনি চান ডেটা কাঠামো, শুরু করার জন্য অ্যারে নয়।
খুব পুরানো প্রশ্ন, তবে এখনও এটি যুক্ত করতে চেয়েছিলেন।
যদি আপনি ওয়ান-লাইনার সন্ধান করে থাকেন তবে আপনি নীচের কোডটি ব্যবহার করতে পারেন। এটি তালিকার কনস্ট্রাক্টরকে একত্রিত করে যা একটি গণনাকারী এবং "নতুন" (যেহেতু প্রশ্ন উত্থাপিত হয়েছিল) ইনিশিয়ালাইজার সিনট্যাক্স গ্রহণ করে।
myArray = new List<string>(myArray) { "add this" }.ToArray();
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> উপাদানগুলিকে তালিকায় যুক্ত করতে পারেন, সুতরাং আপনাকে অবশ্যই নিজের তালিকা উপাদানগুলি এই নোডের মধ্যে আবদ্ধ করতে হবে। আমি মনে করি এটির ব্যবহার অস্বাভাবিক।
Aray.Resizeকোনও অ্যারের সামগ্রী বাদ না দিয়ে এটির আকার পরিবর্তন করতে পারে। ডকস.মাইক্রোসফট.ইন- ইউএস
জেনেরিক টাইপ ব্যবহার করে একটি এক্সটেনশন পদ্ধতি তৈরি করতে আপনি @ স্টিফেন চুং তার লিনকুই ভিত্তিক যুক্তি ব্যবহার করে প্রদত্ত জবাবটি প্রসারিত করতে পারেন।
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();
আপনি যদি অ্যারে নিয়ে প্রচুর পরিশ্রম করছেন এবং কোনও কারণে তালিকাগুলি না করে থাকেন তবে এই জেনেরিক টাইপ করা রিটার্ন জেনেরিক পদ্ধতিটি 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;
}
সমস্ত প্রস্তাবিত উত্তর তারা যা বলে তা এড়াতে পছন্দ করে, একইভাবে একটি নতুন অ্যারে তৈরি করে এবং কেবলমাত্র আরও বেশি ওভারহেড হারিয়ে গেলে এটিতে একটি নতুন এন্ট্রি যুক্ত করে। লিনকুই ম্যাজিক নয়, টি-এর তালিকাটি কিছু অতিরিক্ত স্থান সহ একটি বাফার স্পেস সহ একটি অ্যারে যা আইটেমগুলি যুক্ত হওয়ার সাথে সাথে অভ্যন্তরীণ অ্যারের পুনরায় আকার এড়াতে পারে।
সমস্ত বিমূর্ততা একই সমস্যা সমাধান করতে হবে, খালি স্লট নেই এমন অ্যারে তৈরি করতে হবে যা সমস্ত মান রাখে এবং তাদের ফিরিয়ে দেয়।
আপনার যদি নমনীয়তার প্রয়োজন হয় তবে একটি যথেষ্ট পরিমাণে একটি তালিকা তৈরি করতে পারে যা আপনি পাস করতে পারেন তবে তা করুন that অন্যথায় একটি অ্যারে ব্যবহার করুন এবং সেই থ্রেড-সেফ অবজেক্টটি ভাগ করুন। এছাড়াও, নতুন স্প্যান চারপাশের তালিকাগুলি অনুলিপি না করে ডেটা ভাগ করতে সহায়তা করে।
প্রশ্নের উত্তর দিতে:
Array.Resize(ref myArray, myArray.Length + 1);
data[myArray.Length - 1] = Value;
সুতরাং আপনার যদি বিদ্যমান অ্যারে থাকে তবে আমার দ্রুত ঠিক হয়ে যাবে
var tempList = originalArray.ToList();
tempList.Add(newitem);
এখন কেবল নতুনটির সাথে মূল অ্যারেটি প্রতিস্থাপন করুন
originalArray = tempList.ToArray();
.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>পরিবর্তে আপনি নতুন পদ্ধতিটি ব্যবহার করতে পারেন ।
একটি এক্সটেনশন পদ্ধতি ব্যবহার সম্পর্কে কী? এই ক্ষেত্রে:
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);
লিনকের ইউনিয়ন এক্সটেনশনের এই আচরণটিকে নকল করে দেখুন (দুটি নতুন অ্যারে একটি নতুনতে সংযুক্ত করার জন্য ব্যবহৃত হয়েছিল) এবং লিনক গ্রন্থাগারটি কাজ করতে হবে।
আমি এডের সাথে একমত সি # রিবিডিম সংরক্ষণের সাথে ভিবি যেভাবে সহজ করে তা সহজ করে না। সংগ্রহ ব্যতীত আপনাকে অ্যারেটিকে আরও বড় আকারে অনুলিপি করতে হবে।
ReDim Preserveঅ্যারেটিকে কেবল একটি লেগারে অনুলিপি করে। কোনও অলৌকিক অ্যারে পুনরায় আকার নেই।
string str = "string ";
List<string> li_str = new List<string>();
for (int k = 0; k < 100; i++ )
li_str.Add(str+k.ToString());
string[] arr_str = li_str.ToArray();
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;
}
স্ট্রিংবিল্ডার ক্লাসটি ব্যবহার করে কেন চেষ্টা করবেন না । এটিতে। সন্নিবেশ এবং .্যাপেন্ডের মতো পদ্ধতি রয়েছে। আপনি এখানে এটি সম্পর্কে আরও পড়তে পারেন: http://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.71).aspx
যেহেতু এই প্রশ্নটি প্রদত্ত উত্তরে সন্তুষ্ট নয়, তাই আমি এই উত্তরটি যুক্ত করতে চাই :)
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;
}
}
}
}