我可以在一个语句中对每种语法使用 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
}
如果可能,这样做是否有任何性能优势或缺点?
是的,您可以使用 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
,但Select
和ToList
可能比为每个学生调用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}));
这可能比其他方法的性能略高,但差异可能很小,可以忽略不计。