2013-12-18 8 views
6

Ho un file di disordinata con 500000 linea che le sue informazioni e la data sono come la seguente:Come posso ordinare il file linea txt 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  

Ora come posso implementare una cosa del genere?

Ho provato i metodi sortedList e sorteddictionary ma non c'è modo per l'implementazione di un nuovo valore nell'elenco perché ci sono alcuni valori ripetitivi nell'elenco. Apprezzerei se suggerissi il miglior metodo possibile.

Un'altra cosa, ho visto questa domanda ma questa usa la classe mentre vado con File!

C# List<> Sort by x then y

+2

W hat's sbagliato con l'utilizzo del link che hai postato? – gleng

+1

Non capisco cosa devi fare. Ovviamente hai bisogno di ordinare questa lista, ma qual è il modello ..? – OmniOwl

+0

Sì, desidero ordinare i dati all'interno del file, ma esistono valori duplicati che devono essere considerati . –

risposta

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(); 

duplicati sarà gestita correttamente per impostazione predefinita. Se si desidera rimuoverli, aggiungere .Distinct() da qualche parte, ad esempio dopo ReadAllLines.

+1

Molto ben fatto, e in una riga! –

2

È necessario analizzare il file in un oggetto definito da una classe. Una volta inserito nell'oggetto, puoi iniziare a ordinarlo.

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

Ora, una volta che si ottiene il file analizzato in un elenco di oggetti, si dovrebbe essere in grado di fare qualcosa di simile al seguente:

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 mi ha battuto. Sicuramente la risposta giusta. –

2

In primo luogo, una specie ogni riga in modo che siano nella corretta cassa (es [723,80] -> [80.723]

Poi ordinare tutte le righe utilizzando un qualcosa di confronto come questo:

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; 
}