আমি নিম্নলিখিত আছে
data.AppendFormat("{0},",dataToAppend);
এর সাথে সমস্যা হ'ল আমি এটিকে একটি লুপে ব্যবহার করছি এবং সেখানে একটি ট্রায়ালিং কমা হবে। পেছনের কমা অপসারণের সেরা উপায় কী?
আমাকে কি স্ট্রিংয়ের স্ট্রিংয়ে ডেটা পরিবর্তন করতে হবে?
আমি নিম্নলিখিত আছে
data.AppendFormat("{0},",dataToAppend);
এর সাথে সমস্যা হ'ল আমি এটিকে একটি লুপে ব্যবহার করছি এবং সেখানে একটি ট্রায়ালিং কমা হবে। পেছনের কমা অপসারণের সেরা উপায় কী?
আমাকে কি স্ট্রিংয়ের স্ট্রিংয়ে ডেটা পরিবর্তন করতে হবে?
উত্তর:
সবচেয়ে সহজ এবং সর্বাধিক দক্ষ উপায় হ'ল এই আদেশটি পালন করা:
data.Length--;
এটি করার মাধ্যমে আপনি পয়েন্টারটি (অর্থাত্ শেষ সূচক) একটি অক্ষর পিছনে সরিয়ে ফেলেন তবে আপনি বস্তুর পরিবর্তন করতে পারবেন না। প্রকৃতপক্ষে, একটি সাফ করার পাশাপাশি ভালভাবে StringBuilder
সম্পন্ন করা Length
হয় (তবে প্রকৃতপক্ষে Clear()
স্পষ্টতার জন্য পদ্ধতিটি ব্যবহার করুন কারণ এর বাস্তবায়ন দেখতে এটিই তাই):
data.Length = 0;
আবার, কারণ এটি বরাদ্দ সারণী পরিবর্তন করে না। এটিকে বলার মতো ভাবুন, আমি এই বাইটগুলি আর স্বীকৃতি দিতে চাই না। এখন, কল করার পরেও ToString()
এটি এর অতীতের কোনও কিছুই চিনবে না Length
, ভাল, এটি পারে না। এটি একটি পরিবর্তনীয় অবজেক্ট যা আপনি যা সরবরাহ করেন তার চেয়ে বেশি জায়গা বরাদ্দ করে, এটি কেবল এইভাবে নির্মিত।
data.Length = 0;
: ঠিক StringBuilder.Clear
এটিই তাই, তাই StringBuilder.Clear
উদ্দেশ্যটির স্পষ্টতার জন্য এটি ব্যবহার করা ভাল ।
Clear()
করে তা কিন্তু মজার বিষয়। এটা প্রথম লাইন এর Clear()
পদ্ধতি। তবে, আপনি কি ইন্টারফেসটি আসলে জানতেন return this;
? এখন সেটাই আমাকে মেরে ফেলেছে। Length = 0
আপনার ইতিমধ্যে রেফারেন্স পরিবর্তনগুলি সেট করা, কেন নিজেকে ফেরাবেন?
Append
পাশাপাশি ফিরে আসে।
শুধু ব্যবহার
string.Join(",", yourCollection)
এইভাবে আপনার StringBuilder
আর লুপের দরকার নেই।
অ্যাসিঙ্ক কেস সম্পর্কে দীর্ঘ সংযোজন। 2019 হিসাবে, ডেটা সংকীর্ণভাবে আসে যখন এটি কোনও বিরল সেটআপ নয়।
আপনার ডেটা অ্যাসিঙ্ক সংগ্রহের ক্ষেত্রে কোনও string.Join
ওভারলোড নেওয়ার দরকার নেই IAsyncEnumerable<T>
। তবে কোডstring.Join
হ্যাক করে ম্যানুয়ালি একটি তৈরি করা সহজ :
public static class StringEx
{
public static async Task<string> JoinAsync<T>(string separator, IAsyncEnumerable<T> seq)
{
if (seq == null)
throw new ArgumentNullException(nameof(seq));
await using (var en = seq.GetAsyncEnumerator())
{
if (!await en.MoveNextAsync())
return string.Empty;
string firstString = en.Current?.ToString();
if (!await en.MoveNextAsync())
return firstString ?? string.Empty;
// Null separator and values are handled by the StringBuilder
var sb = new StringBuilder(256);
sb.Append(firstString);
do
{
var currentValue = en.Current;
sb.Append(separator);
if (currentValue != null)
sb.Append(currentValue);
}
while (await en.MoveNextAsync());
return sb.ToString();
}
}
}
যদি ডেটা অবিচ্ছিন্নভাবে আসছে তবে ইন্টারফেসটি IAsyncEnumerable<T>
সমর্থনযোগ্য নয় (মন্তব্যগুলিতে উল্লিখিত মত SqlDataReader
), এটিতে ডেটা মোড়ানো তুলনামূলকভাবে সহজ IAsyncEnumerable<T>
:
async IAsyncEnumerable<(object first, object second, object product)> ExtractData(
SqlDataReader reader)
{
while (await reader.ReadAsync())
yield return (reader[0], reader[1], reader[2]);
}
এবং এটি ব্যবহার করুন:
Task<string> Stringify(SqlDataReader reader) =>
StringEx.JoinAsync(
", ",
ExtractData(reader).Select(x => $"{x.first} * {x.second} = {x.product}"));
ব্যবহার করার জন্য Select
আপনাকে নুগেট প্যাকেজটি ব্যবহার করতে হবে System.Interactive.Async
। এখানে আপনি একটি সংকলনযোগ্য উদাহরণ খুঁজে পেতে পারেন।
string.Join(",", yourCollection)
এখনও একটি ,
শেষে আছে। সুতরাং উপরোক্ত অর্থ string.Join(",", yourCollection)
অকার্যকর এবং এটি নিজে থেকে এটি সরান না।
লুপের পরে নিম্নলিখিতটি ব্যবহার করুন।
.TrimEnd(',')
বা সহজভাবে পরিবর্তন
string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)
string.Join(",", input)
আমি স্ট্রিংবিল্ডারের দৈর্ঘ্যের কারসাজি করতে পছন্দ করি
data.Length = data.Length - 1;
data.Length--
বা না --data.Length
?
--
বা ++
আপনি data.Length -= 1
যদিও ব্যবহার করতে পারেন , বা এই উত্তরটিও কার্যকর হবে।
আমি সুপারিশ করছি, আপনি আপনার লুপ অ্যালগরিদম পরিবর্তন করুন:
হ্যাঁ, লুপটি শেষ হয়ে গেলে এটি একটি স্ট্রিংয়ে রূপান্তর করুন:
String str = data.ToString().TrimEnd(',');
আপনার কাছে দুটি বিকল্প রয়েছে। প্রথমটি খুব সহজে ব্যবহারের Remove
পদ্ধতি এটি বেশ কার্যকর। দ্বিতীয় উপায়টি হল ToString
সূচক এবং শেষ সূচক ( এমএসডিএন ডকুমেন্টেশন ) এর সাথে ব্যবহার করা
আমি স্ট্রিংবিল্ডার এক্সটেনশন পদ্ধতিটি ব্যবহার করে পছন্দ করেছি।
সবচেয়ে সহজ উপায় হ'ল যোগদান () পদ্ধতিটি ব্যবহার করা:
public static void Trail()
{
var list = new List<string> { "lala", "lulu", "lele" };
var data = string.Join(",", list);
}
আপনার যদি সত্যিই স্ট্রিংবিল্ডারের প্রয়োজন হয় তবে লুপের পরে শেষ কমাটি ট্রিম করুন:
data.ToString().TrimEnd(',');
data.ToString().TrimEnd(',');
অদক্ষ
আপনি AppendLine
নীচের মত ব্যবহার করলে এই থ্রেডের বেশিরভাগ উত্তর কাজ করবে না :
var builder = new StringBuilder();
builder.AppendLine("One,");
builder.Length--; // Won't work
Console.Write(builder.ToString());
builder = new StringBuilder();
builder.AppendLine("One,");
builder.Length += -1; // Won't work
Console.Write(builder.ToString());
builder = new StringBuilder();
builder.AppendLine("One,");
Console.Write(builder.TrimEnd(',')); // Won't work
কেন ??? @ (& ** (& @ !!)
ইস্যুটি সহজ তবে এটি নির্ধারণ করতে আমাকে কিছুটা সময় নিয়েছে: কারণ শেষে আরও দুটি অদৃশ্য চরিত্র রয়েছে CR
এবং LF
(ক্যারিজ রিটার্ন এবং লাইন ফিড)। অতএব, আপনাকে শেষের তিনটি অক্ষর কেড়ে নিতে হবে:
var builder = new StringBuilder();
builder.AppendLine("One,");
builder.Length -= 3; // This will work
Console.WriteLine(builder.ToString());
উপসংহারে
আপনি Length--
বা Length -= 1
শেষ পদ্ধতিটি কল করেছিলেন তা ব্যবহার করুন Append
। Length =- 3
আপনি যদি শেষ পদ্ধতিটি কল করেন তবে ব্যবহার করুন AppendLine
।
string.Join(",", yourCollection)
? সম্পাদনা: উত্তর হিসাবে যুক্ত।