В тхт файле есть строки типа :
294|ab
124h|b4
903|ac
626|ad
2364|ag
913a|it
390q|a8
есть строка по которой надо сортировать, то есть string digits="abcdefghijklmnopqrstuvwxyz0123456789";
но как сделать чтобы строки в тхт сортировались по алфавиту "digits", но после |
значка. Если меняется порядок чисел значит меняется и то что до "|"
знака...если эти числа после |
повторяются, значит они идут подряд..после сортировки должно быть так:
294|ab
903|ac
626|ad
2364|ag
390q|a8
124h|b4
913a|it
после |
знака будет строка, длинна все равно какая, надо все что находится после |
сортировать по алфавиту
Сначала создадим класс:
class Line
{
public string Text { get; set; }
public string Fragment { get; set; }
}
и функцию:
private string getFragment(string s,string digits)
{
if (string.IsNullOrEmpty(s))
return string.Empty;
var t = s.Split('|');
if (t.Count() == 1)
return string.Empty;
s = t[t.Count() - 1];
for (int i = 0; i < digits.Length; i++)
{
s = s.Replace(digits[i], (char)i);
}
return s;
}
Функция берет текст после "|" и меняет для сортировки по digits. После этого по клику на буттон:
private void Button1_Click(object sender, EventArgs e)
{
string digits = "0123456789";
var list = new List<Line>();
var lines = File.ReadAllLines("filename");
foreach (var s in lines)
{
list.Add(new Line { Text = s, Fragment = getFragment(s,digits) });
}
lines = list.OrderBy(r => r.Fragment).Select(x => x.Text).ToArray();
File.WriteAllLines("filename", lines);
}
Если просто сортироват по альфавиту, можно так:
class Line
{
public string Text { get; set; }
public string Fragment
{
get
{
if (Text.Contains("|"))
return Text.Split('|')[1];
else return string.Empty;
}
}
}
var list = new List<Line>();
var lines = File.ReadAllLines("filename");
foreach (var s in lines)
{
list.Add(new Line { Text = s});
}
lines = list.OrderBy(r => r.Fragment, StringComparer.OrdinalIgnoreCase).Select(x => x.Text).ToArray();
File.WriteAllLines("filename", lines);
В общем, подход, описанный koshe - создание класса-модели - является правильным.
Но если данные из файла нигде более не используются и вся задача сводится только к его сортировке, то можно сделать так:
var lines = File.ReadAllLines("test.txt");
var sorted = lines.OrderBy(line => int.Parse(line.Split('|')[1]));
File.WriteAllLines("test2.txt", sorted);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Не могу решить умножение матриц через форму, то есть надо задать размер двух матриц так же через форму, умножить и вывести на экран
Для установки KeepAlive опции я использую метод socketIOControl: