C#/LINQ

표준 쿼리 연산자 : LINQ를 통한 데이터 변환(C#)

소나무꼴 2024. 1. 4. 23:15

https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/concepts/linq/data-transformations-with-linq

.

  • 여러 입력 시퀀스를 새 형식을 가진 단일 출력 시퀀스로 병합합니다.
  • 소스 시퀀스에 있는 각 요소의 속성 하나만으로 또는 여러 속성으로 구성된 출력 시퀀스를 만듭니다.
  • 요소가 소스 데이터에서 수행된 작업의 결과로 구성된 출력 시퀀스를 만듭니다.
  • 출력 시퀀스를 다른 형식으로 만듭니다. 예를 들어 데이터를 SQL 행 또는 텍스트 파일에서 XML로 변환할 수 있습니다.

 

여러 입력을 단일 출력 시퀀스로 결합

 

Concat로 두 데이터를 결합

class Student
{
    public string First { get; set; }
    public string Last {get; set;}
    public int ID { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public List<int> Scores;
}

class Teacher
{
    public string First { get; set; }
    public string Last { get; set; }
    public int ID { get; set; }
    public string City { get; set; }
}
class DataTransformations
{
    static void Main()
    {
        // Create the first data source.
        List<Student> students = 
        [
            new Student { First="Svetlana", Last="Omelchenko", ID=111,
                Street="123 Main Street", City="Seattle",
                Scores= new List<int> { 97, 92, 81, 60 } },
            new Student { First="Claire", Last="O’Donnell",ID=112,
                Street="124 Main Street",City="Redmond",
                Scores= new List<int> { 75, 84, 91, 39 } },
            new Student { First="Sven", Last="Mortensen", ID=113,
                Street="125 Main Street", City="Lake City",
                Scores= new List<int> { 88, 94, 65, 91 } },
        ];

        // Create the second data source.
        List<Teacher> teachers =
        [
            new Teacher { First="Ann", Last="Beebe", ID=945, City="Seattle" },
            new Teacher { First="Alex", Last="Robinson", ID=956, City="Redmond" },
            new Teacher { First="Michiyo", Last="Sato", ID=972, City="Tacoma" }
        ];

        // Create the query.
        var peopleInSeattle = (from student in students
                    where student.City == "Seattle"
                    select student.Last)
                    .Concat(from teacher in teachers
                            where teacher.City == "Seattle"
                            select teacher.Last);

        Console.WriteLine("The following students and teachers live in Seattle:");
        // Execute the query.
        foreach (var person in peopleInSeattle)
        {
            Console.WriteLine(person);
        }

    }
}
/* Output:
    The following students and teachers live in Seattle:
    Omelchenko
    Beebe
 */

 

각 소스 요소의 하위 집합 선택

소스 요소의 멤버를 하나만 선택하려면 점 작업을 사용합니다. 다음 예제에서는 Customer 개체에 City 문자열을 비롯한 여러 public 속성이 포함된다고 가정합니다. 실행될 경우 이 쿼리는 문자열의 출력 시퀀스를 생성합니다.

var query = from cust in Customers  
            select cust.City;

 

소스 요소의 속성의 두 개 이상 포함된 요소를 만들려면 개체 이니셜라이저를 명명된 개체 또는 무명 형식과 함께 사용합니다. 다음 예제에서는 무명 형식을 사용하여 각 Customer 요소의 두 개 속성을 캡슐화하는 방법을 보여 줍니다.

var query = from cust in Customer  
            select new {Name = cust.Name, City = cust.City};

 

메모리 내 개체를 XML로 변환

class XMLTransform
{
    static void Main()
    {
        // Create the data source by using a collection initializer.
        // The Student class was defined previously in this topic.
        List<Student> students =
        [
            new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores = new List<int>{97, 92, 81, 60}},
            new Student {First="Claire", Last="O’Donnell", ID=112, Scores = new List<int>{75, 84, 91, 39}},
            new Student {First="Sven", Last="Mortensen", ID=113, Scores = new List<int>{88, 94, 65, 91}},
        ];

        // Create the query.
        var studentsToXML = new XElement("Root",
            from student in students
            let scores = string.Join(",", student.Scores)
            select new XElement("student",
                       new XElement("First", student.First),
                       new XElement("Last", student.Last),
                       new XElement("Scores", scores)
                    ) // end "student"
                ); // end "Root"

        // Execute the query.
        Console.WriteLine(studentsToXML);

    }
}
<Root>  
  <student>  
    <First>Svetlana</First>  
    <Last>Omelchenko</Last>  
    <Scores>97,92,81,60</Scores>  
  </student>  
  <student>  
    <First>Claire</First>  
    <Last>O'Donnell</Last>  
    <Scores>75,84,91,39</Scores>  
  </student>  
  <student>  
    <First>Sven</First>  
    <Last>Mortensen</Last>  
    <Scores>88,94,65,91</Scores>  
  </student>  
</Root>

 

소스 요소에서 작업 수행

class FormatQuery
{
    static void Main()
    {
        // Data source.
        double[] radii = [ 1, 2, 3 ];

        // LINQ query using method syntax.
        IEnumerable<string> output = 
            radii.Select(r => $"Area for a circle with a radius of '{r}' = {r * r * Math.PI:F2}");

        /*
        // LINQ query using query syntax.
        IEnumerable<string> output =
            from rad in radii
            select $"Area for a circle with a radius of '{rad}' = {rad * rad * Math.PI:F2}";
        */

        foreach (string s in output)
        {
            Console.WriteLine(s);
        }
            
    }
}
/* Output:
    Area for a circle with a radius of '1' = 3.14
    Area for a circle with a radius of '2' = 12.57
    Area for a circle with a radius of '3' = 28.27
*/

 

'C# > LINQ' 카테고리의 다른 글

확장명 메서드  (0) 2024.01.03
C# LINQ 쿼리를 작성하여 데이터 쿼리  (0) 2024.01.01
쿼리 식 기본 사항  (0) 2023.12.30
LINQ 쿼리 소개(C#)  (0) 2023.12.30