Sortowanie tablicy po pierwszej kolumnie.

0

Witam
Potrzebuje zoptymalizować kod który otwiera plik .txt dzieli na podstawi tabulatorów i grupuje linie na podstawie pierwszej wartości (1 kolumny), pomijając 2 pierwsze i ostatnia linie. Pogrupowaniu zapisuje do pliku .txt. Problem w tym, ze ja nie potrzebuj zapisywać do pliku txt, chciałbym odrazy zapisać do 1 wymiarowej tablicy.

var input = File.ReadAllLines(@"c:\plik.txt");

var header = input.Take(2);
var sorted = input.Skip(2).Take(input.Length - 3)
    .GroupBy(line => int.Parse(line.Substring(0, line.IndexOf("\t"))))
    .OrderBy(g => g.Key)
    .SelectMany(g => g);
var trailer = input.Skip(input.Length - 1);

File.WriteAllLines(@"c:\posortowany.txt", header.Concat(sorted).Concat(trailer)); //chciałbym pominąć tworzenie pliku, odrazy zapisać do tablicy 
string [] TAB = File.ReadAllLines(@"c:\posortowany.txt";
0

zawsze możesz użyć splita jak chcesz podzielić sobie stringa.

          string Value = "Hello,World";
            
           string [] tab = Value.Split(',').ToArray();
            
            for(int i=0;i<2;i++)
            Console.WriteLine(tab[i]);
1
var input = File.ReadAllLines(@"c:\plik.txt");

var header = input.Take(2);
var sorted = input.Skip(2).Take(input.Length - 3)
	.Select(line => new { FirstColumn = int.Parse(line.Substring(0, line.IndexOf("\t"))), Line = line })
	.OrderBy(o => o.FirstColumn)
	.Select(o => o.Line);
	//.GroupBy(line => int.Parse(line.Substring(0, line.IndexOf("\t"))))
	//.OrderBy(g => g.Key)
	//.SelectMany(g => g);
var trailer = input[input.Length - 1]; // używając skip musi przejść przez całą kolekcję więc skoro jest tablica to lepiej użyć takiego zapisu
var array = header.Concat(sorted).Concat(new[] { trailer }).ToArray();
0
Manuel.Artificer napisał(a):
var input = File.ReadAllLines(@"c:\plik.txt");

var header = input.Take(2);
var sorted = input.Skip(2).Take(input.Length - 3)
	.Select(line => new { FirstColumn = int.Parse(line.Substring(0, line.IndexOf("\t"))), Line = line })
	.OrderBy(o => o.FirstColumn)
	.Select(o => o.Line);
	//.GroupBy(line => int.Parse(line.Substring(0, line.IndexOf("\t"))))
	//.OrderBy(g => g.Key)
	//.SelectMany(g => g);
var trailer = input[input.Length - 1]; // używając skip musi przejść przez całą kolekcję więc skoro jest tablica to lepiej użyć takiego zapisu
var array = header.Concat(sorted).Concat(new[] { trailer }).ToArray();

Dzieki
linie

var array = header.Concat(sorted).Concat(new[] { trailer }).ToArray();

w twojej postaci nie chciała działać|
poprawiłem i działa

var array = header.Concat(sorted).Concat(trailer).ToArray();
0

No bo zmieniłem przypisanie do zmiennej trailer (w moim kodzie będzie zwykłym stringiem, a u Cb IEnumerable<string>) i dodałem odpowiedni komentarz. Tak jak napisałem użycie Skip wymusza przejście po całej kolekcji co wydłuża całą operację.

1 użytkowników online, w tym zalogowanych: 0, gości: 1