根据第一列从csv文件中获取Distinct List

本文关键字:文件 csv 获取 List Distinct 一列 | 更新日期: 2023-09-27 18:20:53

我有以下从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会更简单。

我能在这里找到的所有帖子似乎都很复杂,或者没有解决我问题的细节。任何帮助都将不胜感激。。。

根据第一列从csv文件中获取Distinct List

简单的GroupBy:

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

我宁愿使用HashSet<String>和简单的foreach循环,而不是Linq(IMHO是过冲):

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