每个列表/数组项中包含的列名(LINQ CSV阅读器)

时间:2016-10-28 07:12:07

标签: c# linq csv

我正在使用此CSV阅读器尝试从我的CSV文件中打印出姓名,姓氏和SSN:

static void Main(string[] args)
{
        var query = File.ReadLines(@"C:\CSV\ToAdd.csv")
                        .SelectMany(line => line.Split(';'))
                        .Where(csvLine => !String.IsNullOrWhiteSpace(csvLine))
                        .Select(csvLine => new { data = csvLine.Split(',') })
                        .Select(s => new
                        {
                            Name = s.data[0],
                            Lastname = s.data[1],
                            SSN = s.data[2]
                        });

        foreach (var item in query)
        {
            Console.WriteLine(item);
        }
        Console.ReadKey();
}

到目前为止,我已经取得了一些成功,但问题是它还不断打印出列的名称:

{ Name = Hej, Lastname = Hoj, SSN= 950505-1432 }
{ Name = Huj, Lastname = Hij, SSN= 940304-1332 }

代码的哪一部分正在制作,所以它被打印出来而不是只打印出记录?

1 个答案:

答案 0 :(得分:1)

以这种方式打印时:

foreach (var item in query)
{
    Console.WriteLine(item);
}

它使用.Net实现的ToString()来生成编译器生成的匿名类型。它的实现是以属性名称+值的格式打印数据。

如果您想要这样做,请为打印时提供特定格式:

  1. 使用C#6的字符串插值(这只是语法糖 对于string.Format)你可以这样做:

    foreach (var item in query)
    {
        Console.WriteLine($"{item.Name} {item.Lastname}, {item.SSN}");
    }
    
  2. 使用Console.WriteLine的另一个重载:

    foreach (var item in data)
    {
        Console.WriteLine("{0} {1}, {2}",item.Name, item.Lastname, item.SSN);
    }
    

    3.或者,如果您投射到已定义的类型而不是匿名类型,则可以覆盖对象的ToString,然后问题中的代码将起作用