【问题标题】:Column name included in each list/array item (LINQ CSV reader)每个列表/数组项中包含的列名(LINQ CSV 阅读器)
【发布时间】:2016-10-28 07:12:06
【问题描述】:

我正在使用此 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 }

代码的哪一部分是这样打印出来的,而不是只打印出记录?

【问题讨论】:

  • 我建议更新问题+标题以更好地反映问题 - 打印此 linq 生成的匿名类型对象时,它不是您预期的格式

标签: c# linq csv


【解决方案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,然后您的问题中的代码将起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2014-01-14
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多