2016-01-21 49 views
1

如果我有这两个类:我可以使用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 
} 

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

+0

对你的支撑风格的一点评论 - 在C#中,更多的惯例是在新行上打开和关闭花括号([Allman style](https://en.wikipedia.org/wiki/Indent_style#Allman_style)) 。而你使用的风格更像是JS支撑风格。 JS使用这种风格的原因在[这里](http:// encosia。COM /在-JavaScript的大括号放置位置的事项-AN-示例/)。在C#中tt确实不会影响任何内容,但是阅读起来很简单。 VS编辑器的默认格式可以重新排列所有大括号 - 只需按Ctrl + K,D。 – Yura

+0

@James其实,不,Allman风格对于任何情况都不会有任何外泄。即使只有一行'if'语句体应该被置于新行上的花括号包围。尝试在VS中使用FormatDocument选项和默认的C#设置 - 它会将大括号移动到一个新行中。 – Yura

+0

@Yura感谢您的评论。我通常正确地设置大括号的格式,我很抱歉,我没有在这里做过。最近我一直在处理Android和Java。 – NooooobDeveloper

回答

3

是的,你可以做到这一点使用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查看是否在您的环境有价值的区别。

+0

感谢您的解释。所以使用其他方法基本上更好。 – NooooobDeveloper

+0

不一定 - 这个(可以说)更具可读性 - 你必须做一些[适当的性能测试](http://ericlippert.com/2012/12/17/performance-rant/)来找出哪些是实际上速度更快,并且如果它甚至比另一个更快。 –

+0

你必须枚举两种变体,但是'ToList'可能比每个学生的'List.Add'更快。但是,当然你应该考虑一下这种性能差异是否重要。 –

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要快。

1

你可以只项目中使用选择()和ToList()的列表,像这样:

var studyClass= new StudyClass() 
{ 
    className = classObject.className, 
    students = classObject.students.Select(s=>new Student(){Name=s.Name}).ToList() 
} 
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})); 

这很可能是轻微比其他方法更高效,但差异可能会很小,可以忽略不计。

相关问题