다음과 같은 객체의 리스트가 있습니다. 여기서 이름만 따로 뽑아 리스트를 만들고 싶습니다.
internal class Student
{
internal string name;
internal int kor;
internal int eng;
internal int math;
}
internal List<string> Student2NameList(List<Student> studentList)
{ // Student리스트에서 이름만 뽑아 새 리스트 만듦
var nameList = new List<string>();
foreach(var student in studentList)
nameList.Add(student.Name);
return nameList;
}
Student2NameList메서드는 보통 위와 같이 구현할 수 있습니다.
하지만 C#에서 linq를 이용하면 이런 작업을 좀 더 쉽게 할 수 있습니다. linq(Language Integrated Query)란 것은 배열이나 리스트 등에서 필요한 데이터를 추출하는 데이터베이스의 Query문과 같은 것입니다.
Query문은 다음과 같이 구성되어 있습니다.
from 임시변수 in 데이터뭉치
where 조건식 // 생략가능
select 수식;
데이터뭉치(리스트/배열)의 각 요소가 순서대로 임시변수에 대입하여 조건식을 확인한 후 수식의 새로운 데이터뭉치를 만들어내는 것입니다. 즉
internal List<string> Student2NameList(List<Student> studentList)
{ // Student리스트에서 이름만 뽑아 새 리스트 만듦
var nameList = from student in studentList
// where문 생략
select student.name;
........
}
과 같이 함으로써 studentList 각 요소의 name만 모인 새로운 데이터뭉치를 만들 수 있습니다. 다만 이 데이터뭉치의 타입은 List도 Array도 아닌 IEnumerable형입니다. 그러므로
internal List<string> Student2NameList(List<Student> studentList)
{ // Student리스트에서 이름만 뽑아 새 리스트 만듦
var nameList = from student in studentList
// where문 생략
select student.name;
return nameList.ToList();
}
와 같이 구현 가능합니다.
만약 합격한 학생들의 리스트가 필요하다면 다음과 같이 where문 추가하고 select문을 변경시켜야 합니다.
internal class PassedStudent
{
internal string name;
internal float average;
internal PassedStudent(string name, float average)
{
this.name = name;
this.average = average;
}
}
internal List<string> PassedStudentList(List<Student> studentList)
{ // Student리스트에서 이름만 뽑아 새 리스트 만듦
var nameList = from stu in studentList
where (stu.kor + stu.eng + stu.math) / 3F > 60
select new PassedStudent(stu.name,
(stu.kor + stu.eng + stu.math) / 3F);
return nameList.ToList();
}
댓글 없음:
댓글 쓰기