C# 使用LINQ从阵列创建对象的更快方法?

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

我有一个CSV值列表,我正在将其转换为用户对象。 我已经通过foreach循环实现了这一点,但不知道是否有一种方法可以通过LINQ以更高效的方式实现这一点? 我尝试了使用Select和Where的组合,但似乎找不到适合我的案例的方法

User.cs:

目前的做法:

那么:

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();