2015-11-06 3 views
1

У меня есть следующий список укусы, взятых из файла CSV ...Получить Distinct список из CSV-файла на основе первого столбца

List<string> listOfRecords; 

Каждая строка является строкой в ​​списке ...

one,bob,black 
two,steve,smith 
three,bill,brown 
one,jill,brown 
one,sue,smith 

Я хотел бы удалить дубликаты на основе первого значения в каждой строке. В результате в ...

one,bob,black 
two,steve,smith 
three,bill,brown 

Я думал, что код будет выглядеть примерно так ....

distinctlist = Select listOfRecords.split(',')[0].distinct 

это, очевидно, неправильно, но я хотел бы избежать составления списка списков и делать это таким образом , Мышление linq было бы проще.

Все сообщения, которые я могу найти здесь, кажутся довольно сложными или не затрагивают специфику моего вопроса. Любая помощь будет принята с благодарностью ...

+0

Вы хотите, чтобы первый из каждого «дубликата», где вы основываете свое правило «дублирования» в первом столбце? –

ответ

1

Простой с GroupBy:

var distinctByFirstColumn = listOfRecords 
    .GroupBy(x => x.Split(',')[0]) 
    .Select(x => x.First()); 
1

Я предпочел бы использовать HashSet<String> и простой foreach петлю вместо Linq (что, ИМХО, перерегулирование) здесь:

var distinctList = new List<String>(); 

HashSet<String> taken = new HashSet<String>(); 

foreach (var line in listOfRecords) 
    // you don't want to split all the line, but 1st item only 
    if (taken.Add(line.SubString(0, line.IndexOf(','))) 
    distinctList.Add(line); 

Редактировать: В случае реального CSV файл:

private static IEnumerable<String> CsvDistinctLines(String fileName) { 
    HashSet<String> taken = new HashSet<String>(); 

    foreach (var line in File.ReadLines(fileName)) 
     if (taken.Add(line.SubString(0, line.IndexOf(','))) 
     yield return line; 
    } 

    ... 

    var distinctList = CsvDistinctLines(@"C:\MyFile.csv").ToList(); 
+0

Я бы переместил реализацию на отдельный метод. Наличие 'HashSet ' в той же области, что и другая логика, несколько захламлена. – Kvam

+0

@Kvam: при реализации в виде отдельного метода (см. Мое редактирование) просто поместите 'HashSet ' в этот метод. –

Смежные вопросы