如何从平面CSV数据中读取树(父子)?

时间:2015-08-02 00:44:07

标签: c#

我有一个班级员工:

public class Employee
{
    public Employee()
    {       
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public Employee Manager { get; set; }
}

和一个包含所有员工的csv文件,一行的第一部分是Id,第二部分是名称,第三部分是经理的Id,如果它是空的那么员工没有经理:

2;John;1    
1;James;    
3;Linda;1

我创建了一个类CsvReader,在这个类中我有一个方法GetEmployees,问题是我无法为属性管理器赋值!

...
 var lines = File.ReadAllLines(this.FilePath);
 foreach (var line in lines)
 {
 var parts = line.Split(';');
 var emp = new Employee();
 emp.Id = int.parse(parts[0]);
 emp.Name = parts[1];
 emp.Manager = ????
 }
 return employees;
}

我希望问题很清楚

2 个答案:

答案 0 :(得分:0)

这可以通过以下步骤解决:

  1. 读入所有记录;存储管理员标识(但不要指定管理员值)。为简单起见,只需在Employee类型中添加另一个属性。

  2. 创建Employee对象后,将其添加到public class LoginDialogTest extends WebTest { @Test public void testLoginDialogFromHeader { new HomePage().loadPage(); new Header().clickLogin().login(); verifyLoggedIn(); } @Test public void testLoginDialogFromArticleComment { new ArticlePage(42).loadPage(); // Load an article with id=42 new Article().postComment().login(); verifyLoggedIn(); } } public class LoginDialog { public LoginDialog(Article.CommentButton commentButton) { } public LoginDialog(Header.LoginButton loginButton) { } public void login() { } } public class Article { public class CommentButton { private CommentButton() { } public LoginDialog click() { return new LoginDialog(this); } } public LoginDialog postComment() { return new CommentButton().click(); } } public class Header { public class LoginButton { public LoginDialog click() { return new LoginDialog(this); } } public LoginDialog clickLogin() { return new LoginButton().click(); } } ,其中键是员工ID。

  3. 读完所有记录后,循环遍历Employees字典(顺序无关紧要),并为每个Employee分配Manager值。 (Manager Employee对象为Dictionary<int,Employee>。)

答案 1 :(得分:-1)

创建Dictionary<int, Employee>,在员工Id和Employee类实例之间存储映射,表示该员工并使用它来获取对经理的引用:

var lines = File.ReadAllLines(this.FilePath);
var mapping = new Dictionary<int, Employee>();
foreach (var line in lines)
{
    var parts = line.Split(';');
    var emp = new Employee();
    emp.Id = int.parse(parts[0]);
    emp.Name = parts[1];
    if(!string.NullOrEmpty(parts[2]))
        emp.Manager = mapping[int.Parse(parts[2])];

    mapping[emp.Id] = emp;
}

它不是防弹的,它要求CSV中的数据是正确的:

  • 没有员工将ManagerId指向不存在的经理
  • 经理必须在所有报告之前在文件中声明

但它应该让你知道如何解决你的问题。