我有CSV要转换为User对象的值列表。我已经通过foreach循环做到了这一点,但想知道是否有LINQ一种更有效的方式来做到这一点?我已经尝试过结合使用Select和,Where但是似乎找不到适合于我的情况的方法。
User.cs:
public class User
{
public string FirstName {get; set;}
public string LastName { get; set; }
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
目前的做法:
var lines = File.ReadAllLines(filepath).Select(x => x.Split(';'));
var users = new List<User>();
foreach (var line in lines)
{
var user = new User
{
FirstName = line[0],
LastName = line[1],
Password = line[2]
};
users.Append(user);
}
Run Code Online (Sandbox Code Playgroud)
关于什么 :
var users = lines.Select(line=>new User
{
FirstName = line[0],
LastName = line[1],
Password = line[2]
}).ToList();
Run Code Online (Sandbox Code Playgroud)
无论您是否要立即收集,最后一个ToList是可选的。
您甚至可以一步一步完成以下操作:
var users = File.ReadAllLines(filepath).Select(x=>
{
var line = x.Split(';');
return new User
{
FirstName = line[0],
LastName = line[1],
Password = line[2]
};
}).ToList();
Run Code Online (Sandbox Code Playgroud)
编辑:为了澄清我分解:
var users = File.ReadAllLines("filepath").Select(BuildFromLine).ToList();
Run Code Online (Sandbox Code Playgroud)
该选择将带有字符串作为输入且作为输出(此处为用户)的函数作为参数。然后,我有一个建立用户的功能。在上面的标记中,我将函数转换为匿名lambda。请注意,为清楚起见,我为函数的参数保留了名称x,但在现实世界中,我将其重命名以反映它的真实含义(x变为行,而行变为标记)。
public static User BuildFromLine(string x)
{
var line = x.Split(';');
return new User
{
FirstName = line[0],
LastName = line[1],
Password = line[2]
};
}
Run Code Online (Sandbox Code Playgroud)