2013-12-18 8 views
6

Mam plik nieuporządkowany z 500000 linii, która jego informacje i data są jak następuje:Jak mogę posortować plik txt o linii 5000000?

for instance   desired Result 
------------   ---------------  
723,80    1,4 
14,50     1,5 
723,2     10,8 
1,5     14,50 
10,8     723,2 
1,4     723,80  

Teraz w jaki sposób można zaimplementować coś takiego?

Próbowałem już metod sortedList i sorteddictionary, ale nie ma możliwości implementacji nowej wartości na liście, ponieważ na liście znajduje się kilka wartości powtarzalnych. Byłbym wdzięczny, gdyby zaproponowano najlepszą możliwą metodę.

Jeszcze jedno, widziałem to pytanie, ale ten używa klasy, kiedy idę z File!

C# List<> Sort by x then y

+2

w hat's źle z wykorzystaniem opublikowanego linku? – gleng

+1

Nie bardzo rozumiem, co musisz zrobić. Oczywiście musisz posortować tę listę, ale jaki jest wzór ...? – OmniOwl

+0

Tak, chcę posortować dane w pliku, ale są zduplikowane wartości, które powinny być . –

Odpowiedz

12
var result = File.ReadAllLines("...filepath...") 
       .Select(line => line.Split(',')) 
       .Select(parts => new 
       { 
        V1 = int.Parse(parts[0]), 
        V2 = int.Parse(parts[1]) 
       }) 
       .OrderBy(v => v.V1) 
       .ThenBy(v => v.V2) 
       .ToList(); 

duplikaty będą obsługiwane prawidłowo domyślnie. Jeśli chcesz je usunąć, dodaj gdzieś .Distinct(), na przykład po ReadAllLines.

+1

Bardzo ładnie wykonane, w jednej linii! –

2

Należy przeanalizować plik w obiekcie zdefiniowanym przez klasę. Gdy znajdzie się w obiekcie, możesz zacząć go sortować.

public class myObject 
{ 
    public int x { get; set; } 
    public int y { get; set; } 
} 

Teraz, gdy pojawi się plik analizowany na listę obiektów, powinieneś być w stanie zrobić coś jak następuje:

var myList = new List<myObject>(); //obviously, you should have parsed the file into the list. 
var sortedList = myList.OrderBy(l => l.x).ThenBy(l => l.y).ToList(); 
+0

Konrad pokonał mnie. Zdecydowanie właściwa odpowiedź. –

2

pierwsze, sortowania każdym rzędzie tak, że są one prawidłowe rzędu (np [723,80] -> [80723]

Następnie rodzaj wszystkie wiersze z zastosowaniem porównania, tak:

int Compare(Tuple<int,int> lhs, Tuple<int,int> rhs) 
{ 
    int res = lhs.Item1.CompareTo(rhs.Item1) 
    if(res == 0) res=lhs.Item2.CompareTo(rhs.Item2); 

    return res; 
} 
Powiązane problemy