PDA

View Full Version : سوال: حذف یک خط از رشته



shahryars
سه شنبه 29 بهمن 1398, 05:29 صبح
سلام
من میخوام کاری کنم که یک خط مشخص از استرینگم پاک شه
این کد رو نوشتم: (به عنوان مثال خط 2 در این کد)

string str = "";
for (int i = 1; i <= textBox2.Text.Split('\n').Length; i++)
{
if (i != 2)
{
str = str + GetLine(textBox2.Text, i) + Environment.NewLine;
}
}
str = str.Remove(str.Length - 1);
textBox2.Text = str;


(getline محتوای خط n رو میده که به این صورت نوشتمش: )
string GetLine(string text, int lineNo)
{
string[] lines = text.Replace("\r", "").Split('\n');
return lines.Length >= lineNo ? lines[lineNo - 1] : null;
}

اما وقتی اجرا میکنم برنامه هنگ میکنه.
جالبه که وقتی بجای

textBox2.Text = str;

مینویسم:

textBox3.Text = str;

این مشکل هنگ پیش نمیاد و برنامه به درستی کار میکنه
یعنی فقط وقتی استینگ رو از تکست باکس 2 میگیرم، و در نهایت به داخل تکستباکس 2 میریزم هنگ میکنه
اگه استرینگ رو از تکستباکس 2 بگیرم و خروجی رو به تکستباکس 3 بریزم برنامه به درستی اجرا میشه.
لطفا کمکم کنید ایرادش رو پیدا کنم
یا اگه روش بهتری برای حذف یک خط مشخص از استرینگ دارید بهم بگید.
یعنی مثلا استرینگ ما اینه :


1
2
3
4
5


میخوام خط n ام، (مثلا دوم) پاک شه و به این صورت در بیاد:


1
3
4
5


تشکر

sadegi
سه شنبه 29 بهمن 1398, 08:03 صبح
با سلام
کدت رو نگاه کردم و مشکلی نبود . علت هنگ رو هنوز نفهمیدم
اما یه روش دیگه بهتون پیشنهاد میدم
private void button1_Click(object sender, EventArgs e)
{
string line = "";
string str = "";
int Counter = 0;
StringReader strReader = new StringReader(textBox2.Text);
while ((line = strReader.ReadLine()) !=null)
{
Counter++;
if (Counter == 2)
{
continue;
}
str = str + line + Environment.NewLine;
}
textBox2.Text = str;
}

میتونید هر شرطی رو توش بزارید . StringReader کلاس خیلی قوی هست . سرعت زیادی هم داره . اگر متن مورد نظر طولانی هست حتما از این کلاس استفاده کنید
متد ReadLineAsync رو هم برای رشته های خیلی بزرگ بدون فریز شدن UI بدردتون میخوره

shahryars
سه شنبه 29 بهمن 1398, 22:19 عصر
ممنون استاد عالی بود این:لبخندساده:
فقط میخواستم بدونم کدی که من نوشتم روی کامپیوتر شما هم هنگ کرد؟

the king
سه شنبه 29 بهمن 1398, 23:04 عصر
سلام
من میخوام کاری کنم که یک خط مشخص از استرینگم پاک شه
این کد رو نوشتم: (به عنوان مثال خط 2 در این کد)

اما وقتی اجرا میکنم برنامه هنگ میکنه.
جالبه که وقتی بجای

textBox2.Text = str;

مینویسم:

textBox3.Text = str;

این مشکل هنگ پیش نمیاد و برنامه به درستی کار میکنه
یعنی فقط وقتی استینگ رو از تکست باکس 2 میگیرم، و در نهایت به داخل تکستباکس 2 میریزم هنگ میکنه
اگه استرینگ رو از تکستباکس 2 بگیرم و خروجی رو به تکستباکس 3 بریزم برنامه به درستی اجرا میشه.
لطفا کمکم کنید ایرادش رو پیدا کنم

تشکر

وقتی دارید محتویات کنترل ها رو تغییر میدید مثلا textBox2.Text رو با مقدار جدیدی پر می کنید، رخدادی مثل TextChanged بروز پیدا می کنه.
اگر برای این رخداد متدی ننوشته باشید که طوری نیست، اما اگر به متدی مثل textBox2_TextChanged متصل اش کردید، باید حواستون باشه که اون متد نیاد، مجددا باعث تغییر مقدار textBox2 بشه.
چرا؟ چون اگر اینکار رو بکنه باز یک رخداد TextChanged دیگه اتفاق می افته و یک حلقه تکرار بی انتها بوجود میاد. بالاخره یکجا باید این حلقه تکرار رو متوقف کنید، یا دیگه مقدار textBox2.Text رو تغییر ندهید، یا اگر تغییر دادید در textBox2_TextChanged مجددا مقدارش رو تغییر ندید.
یکی از روش هایی که می توانید جلوی این حلقه رو بگیرید استفاده از یک متغیر جانبی است. یعنی در جایی که نمی خواهیم رخداد TextChanged برای تغییر مقدار کاری انجام بدهد،
مقدارش را true می کنیم تا رخداد کاری انجام ندهد و وقتی تغییر مورد نظر را اعمال کردیم مجددا false اش می کنیم.

private bool _freeze;

private void textBox1_TextChanged(object sender, EventArgs e)
{
if (_freeze)
{
return;
}
textBox1.Text = "new value";
}

private void button1_Click(object sender, EventArgs e)
{
_freeze = true;
textBox1.Text = "sample";
_freeze = false;
}