یه روش هست کمی سخت تره اما مشکل بالایی رو نداره، من میگم برای کسایی که دوست دارن بدونن.
ساخت کلاس + استفاده از Split.
یک کلاس نیاز داریم که دو پراپرتی از نوع رشته داشته باشه، رشته اول متن اول و رشته دوم باید متن بعدی رو در خودش نگه داره.
میایم کل متن رو با استفاده از تابع ReadToEndـه متغیر StreamReader میگیریم و درون یک رشته میریزیم.
بعد یک لیست از نوع رشته ایجاد میکنیم و متن رو Split می کنیم به لاین های متفاوت.
سپس لیستی از کلاسی که ساختیم ایجاد میکنیم.
با استفاده از حلقه for میایم توی لیست اسپلیت شده میچرخیم و آیتم ها رو میگیریم.
از کلاسی که ساختیم یک متغیر ایجاد می کنیم.
اگه آیتم بعدی یا همون خط بعدی با name: شروع شده بود، یعنی آیتم بعدی هم باید اسمش رو بگیریم.
آیتم اول رو میریزیم توی متغیر اول کلاسمون و آیتم دوم اگه وجود داشت میریزیم توی متغیر دوم کلاس اگه هم نبود که هیچ، پس اگه نبود متغیر دوم کلاسمون null هست.
برای اضافه کردن به لیست از Linq استفاده میکنیم، با استفاده از تابع Any توی لیست جستجو می کنیم و میگیم اگه توی لیستمون، آیتم بعدی(دوم) برابر با آیتم اول چیزی هست که میخوایم اضافه کنیم نبود، به لیست اضافه ش کن، اگه بود که هیچ کاری انجام نده، دلیل این کار این هست که آیتم دوم رو جای آیتم اول اضافه نکنیم.
بیرون از حلقه for حلقه دیگری از نوع foreach میسازیم که درون لیست بچرخه، توی این میایم میگیم آیتم اول رو به لیست اول اضافه میکنیم و یه شرط میزاریم که اگه آیتم دوم null یا خالی نبود به لیست باکس دوم اضافه شه.
این کد ها:
فضاهای مورد نیاز:
using System.Diagnostics;
using System.Linq;
ساخت کلاس مورد نیاز:
public class TestCS
{
public string CurrentText { get; set; }
public string NextText { get; set; }
}
باقی کدها:
using (var TReader = new System.IO.StreamReader(dialog.FileName))
{
string content = TReader.ReadToEnd();
List<string> splittedList = new List<string>(content.Split(new string[]
{
Environment.NewLine
}, StringSplitOptions.RemoveEmptyEntries));
List<TestCS> list = new List<TestCS>();
for (int i = 0; i < splittedList.Count; i++)
{
string item = splittedList[i];
var searchtag = "name:";
if (item.StartsWith(searchtag))
{
var newStr = item.Substring(item.IndexOf(searchtag) + searchtag.Length);
// newStr har chizi k bad name: dar line gharar dare hast
TestCS t = new TestCS();
Debug.WriteLine(i + " " + newStr);
t.CurrentText = newStr;
if (splittedList.Count > (i + 1))
{
string nextItem = splittedList[i + 1];
if (nextItem.StartsWith(searchtag))
t.NextText = nextItem.Substring(nextItem.IndexOf(searchtag) + searchtag.Length);
}
if (list.Any(s => s.NextText == newStr) == false)
list.Add(t);
}
}
foreach (TestCS item in list)
{
if (string.IsNullOrEmpty(item.NextText) == false)
listBox2.Items.Add(item.NextText);
listBox1.Items.Add(item.CurrentText);
}
}
موفق باشید.