【问题标题】:Reading csv and adding to List<Custom class> gives inconsistent null values读取 csv 并添加到 List<Custom class> 会给出不一致的空值
【发布时间】:2021-08-04 07:45:19
【问题描述】:

我正在尝试读取一个包含 5 列(int、str、int、str、str)的 csv 文件:

1234, wef23, 1, Mary, Smith
1234, wef23, 1, Mary, Smith

并将它们添加到列表中:

private List<PermittedUsers> okUsers = new List<PermittedUsers>();

PermittedUsers 已定义:

 class PermittedUsers : MonoBehaviour{
                public int IdNum, part;
                public string upi, firstName, lastName;
                public PermittedUsers(int id, string up, int pt, string fname, string lname){
                    IdNum   = id;
                    upi     = up;
                    pt      = part;
                    fname   = firstName;
                    lname   = lastName;
                }

但是,在导入之后,firstName 和 lastName 都为 null,part 为默认的 0 值。但是,upi(作为字符串)和 IdNum(作为 int)都按预期添加到列表中。导入代码为:

// import 5 column csv: ID, UPI, yearLevel, First, Last
var dataset = Resources.Load<TextAsset>("permittedUsers"); // this is loading the file in Unity without System.IO
var dataLines = dataset.text.Split('\n');
for(int i = 1; i < dataLines.Length-1; i++) { // skip header line and last empty line
    var data = dataLines[i].Split(',');
    okUsers.Add(new PermittedUsers(int.Parse(data[0]), data[1], int.Parse(data[2]), data[3], data[4].Replace("\r", string.Empty)));
}    

调试和检查数据我可以看到它返回一个具有正确值的字符串[5](作为字符串)。

我对这里的不一致感到最困惑,为什么 upi 而不是 fname 会正确添加到列表中?为什么是IdNum,而不是pt?它发生在 CSV 中的 all 行中,所以我不认为这是由于特殊字符造成的。我还缺少什么?

【问题讨论】:

  • 看起来像一个错字.. 构造函数中的字符串分配应该反过来.. ;) 无论哪种方式... 禁止在MonoBehaviour 上使用new 你确定它甚至应该是MonoBeuaviour 吗?

标签: c# list csv unity3d


【解决方案1】:

当您调用构造函数时,您可能会留下未填充的 PermittedUsers 的某些属性。

   class PermittedUsers : MonoBehaviour{
   public int IdNum, part;
   public string upi, firstName, lastName;
   
   public PermittedUsers(int id, string up, int pt, string fname, string lname){
       IdNum   = id;
       upi     = up;
       pt      = part; // possible flipped assignment
       fname   = firstName; // possible flipped assignment
       lname   = lastName; // possible flipped assignment
   }

最明显

pt = part;

看起来应该是part = pt;

fname = firstName; lname = lastName;

应该是

firstName = fname;
lastName = lname;

如果这是问题所在,避免这种情况的快速提示是始终在构造函数中使用 this 关键字。这有助于您作为开发人员看到属性(在您的情况下是字段)正在对象上正确设置,而不是相反。例如:

class PermittedUsers : MonoBehaviour{
   public int IdNum, part;
   public string upi, firstName, lastName;
   
   public PermittedUsers(int id, string up, int pt, string fname, string lname){
       this.IdNum   = id;
       this.upi     = up;
       this.part = pt;
       this.firstName = lname;
       this.lastName = lname;
   }
}

【讨论】:

  • 一般来说也不应该是MonoBehaviour!不允许实现构造函数,也不允许将new 用于MonoBehaviour
猜你喜欢
  • 2016-01-19
  • 1970-01-01
  • 2015-11-25
  • 2015-03-27
  • 2015-07-15
  • 1970-01-01
  • 2010-10-16
  • 2022-12-17
  • 1970-01-01
相关资源
最近更新 更多