如果我有这两个类:
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
}
如果有可能,这样做是否有任何性能上的好处或缺点?
答案 0 :(得分:4)
是的,您可以使用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函数一次,其中表达式使用当前值(Student
)返回一个新的s
来设置studentName
属性。
这样做有任何性能上的好处或缺点吗?
它不太可能更具表现力;在内部,它仍然必须枚举classObject.students
并且必须调用lambda方法,而原始方法必须使用List.Add
。 You need to properly measure了解在您的环境中是否有所作为的时间。
答案 1 :(得分:1)
您可以使用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
更快。
答案 2 :(得分:1)
您可以使用Select()和ToList()来投射列表,如下所示:
var studyClass= new StudyClass()
{
className = classObject.className,
students = classObject.students.Select(s=>new Student(){Name=s.Name}).ToList()
}
答案 3 :(得分:0)
看起来您想要从一个列表中克隆学生并将其附加到另一个列表中。
你可以这样做:
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}));
这可能比其他方法的性能略高,但差异可能很小,可以忽略不计。