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

时间:2016-01-21 09:59:18

标签: c# lambda

如果我有这两个类:

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
}

如果有可能,这样做是否有任何性能上的好处或缺点?

4 个答案:

答案 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.AddYou 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,但SelectToList可能比为每个学生调用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}));

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