【问题标题】:Access list from another class c#来自另一个类 c# 的访问列表
【发布时间】:2021-06-16 10:53:34
【问题描述】:

我使用 c# 为我的程序创建了两个类,第一个“PayRecordSettings”读取一个包含 5 列的 CSV 文件(使用 CSV 帮助程序)。第二个类“createPayRecord”应该获取列表并为每一列创建一个子列表。我设法读取了 CSV 文件并从 Main 调用它并显示数据,但我还没有弄清楚如何获取数据并将其传递给其他类。这是我的代码

public class CsvImporter
{
    public static List<PayRecordSettings> ImportPayRecords()
    {
        using (var path = new StreamReader("C:\\Users\\Import\\data.csv"))
        {
            using (var csvRead = new CsvReader(path, CultureInfo.InvariantCulture))
            {
                csvRead.Context.RegisterClassMap<CsvSettingsMap>();
                var PayRecord = csvRead.GetRecords<PayRecordSettings>().ToList();
                return PayRecord;
            }
        }
    }

    public static List<PayRecordSettings> createPayRecord()
    {            
            foreach (PayRecordSettings details in payRecords)
        {
            Console.WriteLine(details.Hours + " hours" + details.Rate);
        }

        return ImportPayRecords;
    }
}

public class CsvSettingsMap : ClassMap<PayRecordSettings>
{
    public CsvSettingsMap()
    {
        Map(m => m.EmployeeId).Name("EmployeeId");
        Map(m => m.Hours).Name("Hours");
        Map(m => m.Rate).Name("Rate");
        Map(m => m.Visa).Name("Visa");
        Map(m => m.YearToDate).Name("YearToDate");
    }
}

public class PayRecordSettings
{

    public int EmployeeId { get; set; }
    public double Hours { get; set; }
    public double Rate { get; set; }
    public string Visa { get; set; }
    public string YearToDate { get; set; }
}

有没有办法让空单元格等于0

我已经根据 Fildor cmets 更新了我的代码。我必须报告它的大部分工作。当有一个空单元格时,CSV Helper 设置没有添加 0。我还有另一个问题,来自 PayRecordsettings 方法,一旦我调用了列表,如何将其存储在新的子列表中?如果我有 5 个变量,我想将完整的 CSV 列存储在一个新列表中。

public static List<PayRecordSettings> createPayRecord()
{
    var payRecords = ImportPayRecords();
    foreach (PayRecordSettings details in payRecords)
    {
        Console.WriteLine(details.Hours);
    }
    
    return payRecords;
}   /* I would like to create a new list of Employee
                                        list of Hours

【问题讨论】:

  • 这还能编译吗? ImportPayRecords 是一种方法,但用作属性。顺便说一句,也许 PayRecordSettings 应该是 record
  • Bit OT:重新考虑你的命名。想想不知道你的代码/程序的人。所以命名你的东西,这个人可以尽快理解代码的作用。我读了你的第一行,你说的是:我建立了一个 CSV 导入器。但我认为数据来自 CSV 的事实与程序的功能无关。
  • 您的描述与您的代码不匹配:“第一个“PayRecordSettings”读取和 CSV 文件” - 不,它不匹配。 "第二个类 "createPayRecord" " - Tat 不是一个类。
  • “有没有办法让空单元格等于 0?” CSVHelper 的记录行为是什么?你能注释模型属性吗?
  • 你能帮忙minimal reproducible example吗?另外,请告诉我们您正在使用哪些软件包,以便我们运行您的代码。

标签: c# csvhelper


【解决方案1】:

您发布的代码看起来缺少一些东西。您在 createPayRecord 方法中使用了尚未创建的变量,例如 ImportPayRecordspayRecords

要完成您想做的事情,您需要将数据作为参数传递给您的函数,如下所示:

public static void CreatePayRecord(IList<PayRecordSettings> payRecords)
{      

    foreach (PayRecordSettings details in payRecords)
    {
        Console.WriteLine(details.Hours + " hours" + details.Rate);
    }

}

另一个提示,坚持推荐的naming-conventions of C#,并尝试为您的变量找到更具描述性的名称。

【讨论】:

    【解决方案2】:

    有没有办法让空单元格等于0?

    如果我正确阅读了文档,它应该是这样的:

    public class PayRecordSettings
    {
    
        public int EmployeeId { get; set; }
        [Optional]
        public double Hours { get; set; } = 0.0;
        [Optional]
        public double Rate { get; set; } = 0.0;
        public string Visa { get; set; }
        public string YearToDate { get; set; }
    }
    
    public class CsvSettingsMap : ClassMap<PayRecordSettings>
    {
        public CsvSettingsMap()
        {
            AutoMap(CultureInfo.InvariantCulture);
        }
    }
    

    免责声明:尚未对此进行测试!所以,吃点盐吧。

    "...但我还没有弄清楚如何获取数据并将其传递给其他类"

    您在这里混淆了一些术语:

    public class CsvImporter  // <- THIS is a class
    {
        // This is a (static) method
        public static List<PayRecordSettings> ImportPayRecords()
        {
           
            using (var path = new StreamReader("C:\\Users\\Import\\data.csv"))
            {
                using (var csvRead = new CsvReader(path, CultureInfo.InvariantCulture))
                {
                    csvRead.Context.RegisterClassMap<CsvSettingsMap>();
                    var PayRecord = csvRead.GetRecords<PayRecordSettings>().ToList();
                    return PayRecord;
                }
            }
        }
    
        // This is another static method.
        public static List<PayRecordSettings> createPayRecord()
        {   
            // this makes no sense: `payRecords` does not exist here.         
            foreach (PayRecordSettings details in payRecords)
            {
                Console.WriteLine(details.Hours + " hours" + details.Rate);
            }
            
            // makes no sense, neither. If at all, it should be `ImportPayRecords()`.
            return ImportPayRecords;
        }
    }
    

    所以,要修正你的第二种方法,试试这个:

    public static List<PayRecordSettings> CreatePayRecord()
    {   
        var payRecords = ImportPayRecords();
        foreach (PayRecordSettings details in payRecords)
        {
            Console.WriteLine(details.Hours + " hours" + details.Rate);
        }
        
        return payRecords;
    }
    

    请注意,这两种方法之间存在依赖关系,这是……好吧……假设是“次优”。另外CreatePayRecord 实际上并没有做太多的创作。所以你可能想重构使用ImportPayRecords 来获取模型实例的列表,也许像这样打印出来:

    public static void PrintPayRecords(IEnumerable<PayRecordSettings> payRecords)
    {   
        foreach (PayRecordSettings details in payRecords)
        {
            // Sticking to your format, but looks kinda weird.
            Console.WriteLine("{0} hours{1}", details.Hours, details.Rate);
        }
    }
    

    【讨论】:

    • 谢谢 Fildor,你们的 cmets 真的帮助了我。 CSV 帮助程序设置没有向空单元格添加 0,但其余代码运行良好,如何为每个类别创建一个新的子列表。假设我想要一个仅包含 ID 项的新列表和另一个仅包含 Hours 的列表。
    【解决方案3】:

    第一个问题:将默认的空单元格设置为 0。

    如果字段为空,您可以使用.Default() 作为默认值。

    此外,对于您的地图类,如果属性名称已经是“EmployeeId”,则不需要.Name("EmployeeId")。它会自动假定这是名称。如果您收到标题为“EmpId”的 CSV 文件,那么您需要 Map(m =&gt; m.EmployeeId).Name("EmpId")

    public class CsvSettingsMap : ClassMap<PayRecordSettings>
    {
        public CsvSettingsMap()
        {
            Map(m => m.EmployeeId);
            Map(m => m.Hours).Default(0);
            Map(m => m.Rate).Default(0);
            Map(m => m.Visa);
            Map(m => m.YearToDate);
        }
    }
    

    第二个问题:一旦我调用了列表,如何通过 PayRecordsettings 方法将其存储在新的子列表中?如果我有 5 个变量,我想将完整的 CSV 列存储在一个新列表中。

    我真的很难理解您要做什么。您能否提供一些将在 PayRecordSettings 中的示例数据,然后提供一些您希望子列表数据看起来如何的示例?您是否希望将其输出到新的 CSV 文件中?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多