我可以在一个语句中对每种语法使用 lambda 初始化一个对象吗?

本文关键字:语法 lambda 初始化 一个对象 语句 一个 我可以 | 更新日期: 2023-09-27 18:31:26

如果我有这两个类:

public class StudyClass
{
    public string className { get; set; }
    public List<Student> students { get; set; }
}
public class Student
{
    public string studentName { get; set; }
}

然后我可以像这样初始化 StudyClass 对象:

var classObject = GetClassData(); // returns a big object with many properties that I don't need
var studyClass= new StudyClass() {
    className = classObject.className
}
foreach(var student in classObject.students)
{
    studyClass.students.add(new Student() {
        studentName = student.Name
    });
}

是否有可能以更简单的方式做到这一点,通过执行以下操作:

var classObject = GetClassData(); // returns a big object with many properties that I don't need
var studyClass= new StudyClass() {
    className = classObject.className,
    students = classObject.students.ForEach...// i am stuck here
}

如果可能,这样做是否有任何性能优势或缺点?

我可以在一个语句中对每种语法使用 lambda 初始化一个对象吗?

是的,您可以使用 LINQ Select 方法执行此操作,然后使用 ToList 将结果作为列表返回:

var classObject = GetClassData();
var studyClass = new StudyClass {
    className = classObject.className
    students = classObject.students.Select(s => new Student { studentName = s.Name}).ToList()
};

这将枚举classObject.students为每个函数调用一次 lambda 函数,其中表达式使用当前值 (s) 返回一个新Student来设置 studentName 属性。

这样做有什么性能优势或缺点吗?

不太可能提高性能;在内部,它仍然必须枚举classObject.students并且必须调用lambda方法,而原始方法必须使用List.Add。 您需要正确测量时间,以确定它是否对您的环境产生了有价值的影响。

你可以使用 linq 来做到这一点:

var studyClass= new StudyClass() {
    className = classObject.className,
    students = classObject.students.Select(s => new Student { studentName = s.Name }).ToList();
}

可能会有一点性能改进。您必须在这两种变体中枚举classObject.students,但SelectToList可能比为每个学生调用List.Add更快。

您可以使用 Select() 和 ToList() 投影列表,如下所示:

var studyClass= new StudyClass() 
{
   className = classObject.className,
   students = classObject.students.Select(s=>new Student(){Name=s.Name}).ToList()
}

看起来您想从一个列表中克隆学生并将其附加到另一个列表。

你可以这样做:

studyClass.students.AddRange(
    classObject.students.Select(student => 
        new Student {studentName = student.studentName}));

如果您确实想用新列表替换列表,则可以改为执行以下操作:

studyClass.students = new List<Student>(
    classObject.students.Select(student => 
        new Student {studentName = student.studentName}));

这可能比其他方法的性能略高,但差异可能很小,可以忽略不计。