C# 使用LINQ从阵列创建对象的更快方法?
我有一个CSV值列表,我正在将其转换为用户对象。 我已经通过foreach循环实现了这一点,但不知道是否有一种方法可以通过LINQ以更高效的方式实现这一点? 我尝试了使用Select和Where的组合,但似乎找不到适合我的案例的方法 User.cs: 目前的做法: 那么:C# 使用LINQ从阵列创建对象的更快方法?,c#,linq,C#,Linq,我有一个CSV值列表,我正在将其转换为用户对象。 我已经通过foreach循环实现了这一点,但不知道是否有一种方法可以通过LINQ以更高效的方式实现这一点? 我尝试了使用Select和Where的组合,但似乎找不到适合我的案例的方法 User.cs: 目前的做法: 那么: var users = lines.Select(line=>new User { FirstName = line[0], LastName = line
var users = lines.Select(line=>new User
{
FirstName = line[0],
LastName = line[1],
Password = line[2]
}).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();
编辑:
为了澄清,我分解:
var users = File.ReadAllLines("filepath").Select(BuildFromLine).ToList();
select将一个函数作为参数,该函数以字符串作为输入,用户在此以任何内容作为输出。然后我有一个功能来构建我的用户。
在上面的表示法中,我将函数转换为匿名lambda。
请注意,为了清楚起见,我保留了函数参数的名称x,但在现实世界中,我会将其重命名,以反映它的真实含义,x变为line,line变为token
public static User BuildFromLine(string x)
{
var line = x.Split(';');
return new User
{
FirstName = line[0],
LastName = line[1],
Password = line[2]
};
}
您可以完全使用LINQ来实现:
var users = File.ReadAllLines(path)
.Select(line => line.Split(';'))
.Select(splitLine => new User { FirstName = splitLine[0], LastName = splitLine[1], Password = splitLine[2] })
.ToArray();
这段代码是否被证明是一个瓶颈?为什么您希望它性能更好,您尝试了什么?您可以使用LiNQ的选择函数:var users=lines.Selectline=>newuser{FirstName=line[0],LastName=line[1],Password=line[2]};我假设这段代码是IO绑定的,而不是CPU绑定的。一个小优化是,您可以将用户初始化为行的长度,以避免调整列表的大小。您能描述一下您期望的效率吗。漂亮的代码或运行速度快的代码?但这更快吗?@CodeCaster这就是目的吗?他希望它是有效的。这可以是:cpu效率高,内存效率高,或者只是看起来不错的代码。正如他提到的,他尝试了select和where,我理解他只是想让代码更加优雅。在stzvggmd澄清他的立场之前,贬低我的答案是没有道理的。
public static User BuildFromLine(string x)
{
var line = x.Split(';');
return new User
{
FirstName = line[0],
LastName = line[1],
Password = line[2]
};
}
var users = File.ReadAllLines(path)
.Select(line => line.Split(';'))
.Select(splitLine => new User { FirstName = splitLine[0], LastName = splitLine[1], Password = splitLine[2] })
.ToArray();