【问题标题】:Create a CSV of class members from a list<T>从列表中创建班级成员的 CSV<T>
【发布时间】:2014-10-04 18:17:30
【问题描述】:

我有一个包含整数和字符串的简单结构列表。

结构:

public struct ErrorType
    {
        public int RowNumber;
        public int ColumnNumber;
        public string ErrorMessage;
    }

On of My methods 返回这些结构的列表。 我想将列表中的每个成员转换为其字符串形式并用逗号分隔,以便 List 现在是一个字符串数组。我可以编写一个函数来手动执行此操作,但我更喜欢使用 linq 来获得更清洁的解决方案。

拥有字符串数组,我将使用

将其写入文件
 string path = @"c:\temp\MyTest.txt";

    // This text is added only once to the file. 
    if (!File.Exists(path))
    {
        // Create a file to write to.

        List<ErrorType> ErrorTypesList = GetErrors();

        //do some work to iterate over the members and do a string.join after 
        string[] ErrorListArray = ErrorTypesList.foreach( e => { });
        File.WriteAllLines(path, createText);
    }

是否有人对如何填写 foreach 有什么建议,以便它以 ToString 形式返回每个成员,后跟逗号?

【问题讨论】:

    标签: linq list csv generics


    【解决方案1】:

    您可以使用 LINQ 进行属性迭代的唯一方法是使用反射,除非您绝对必须这样做(实际上看起来不像您这样做),否则您不应该这样做。

    不过,你能做到的最好的,还不算太差。

    var rows = ErrorTypesList
               .Select(c => "\"" + string.Join("\",\"", c.RowNumber, c.ColumnNumber, c.ErrorMessage) + "\"");
    
    File.WriteAllLines(path, rows);
    

    我也冒昧地将字段放在引号中,您可能想要也可能不想要,但很容易修复该代码以执行您想要的操作。您可能还想添加一些转义逻辑,等待c.ErrorMessage 可能有什么样的内容。

    如果您对此更满意,也可以使用 string.Format,但在这里并没有什么不同。

    var rows = ErrorTypesList
               .Select(c => string.Format("\"{0}\", \"{1}\", \"{2}\"", c.RowNumber, c.ColumnNumber, c.ErrorMessage));
    

    【讨论】:

    • Refection 本来会很酷,但是对于我正在做的事情来说它有点过头了,不过这很完美,谢谢
    【解决方案2】:

    看来你想要这样的东西:

    string[] ErrorListArray = ErrorTypesList
         .Select(e => string.Join(",", e.RowNumber, e.ColumnNumber, e.ErrorMessage))
         .ToArray();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2020-03-15
      • 2020-12-26
      相关资源
      最近更新 更多