2021년 8월 17일 화요일

C# linq를 이용한 리스트 변환

 다음과 같은 객체의 리스트가 있습니다. 여기서 이름만 따로 뽑아 리스트를 만들고 싶습니다.


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(); }




2021년 6월 22일 화요일

C# 모든 Enum값 Iterator

 



internal enum EnumType { A, B, C, }


foreach (EnumType idx in Enum.GetValues(typeof(EnumType)))
    ....;