2014-05-21 17 views
5

sto leggendo un file di testo in un dizionario con una breve espressione LinqLeggi file di testo nel dizionario senza duplicati

string[] lines = File.ReadAllLines(path); 
var dictionary = lines.Select(line => line.Split(';')).ToDictionary(keyValue => keyValue[0], bits => bits[1]); 

Questo funziona bene finché non ho chiavi duplicate nel mio file di testo. C'è un modo breve per filtrare quelli senza percorrere la lunga strada e scorrere le righe [] array?

+2

Che cosa * vuoi * che accada se ci sono duplicati? Posso pensare ad almeno 5 diverse opzioni in cima alla mia testa. (Prime vittorie, ultime vincite, eccezioni, rendere ogni valore un elenco, utilizzare una sorta di separatore.) –

+0

Semplicemente non aggiungerli al dizionario :) – silent

+0

Quindi vuoi un approccio "prima entrata vince", ignorando silenziosamente i dati? –

risposta

10

È possibile utilizzare GroupBy prima:

var dictionary = lines.Select(line => line.Split(';')) 
    .GroupBy(arr => arr[0]) 
    .ToDictionary(g => g.Key, g => g.First()[1]); 

Viene selezionato il primo elemento di ogni duplicato, se questo non è desiderato è necessario cambiare g.First conseguenza. Ad esempio, è possibile separare i valori con una virgola:

var dictionary = lines.Select(line => line.Split(';')) 
    .GroupBy(arr => arr[0]) 
    .ToDictionary(g => g.Key, g => string.Join(",", g.Select(arr=> arr[1])));