014. LINQ Query Operators

2021. 10. 27. 19:47·사소한 아이의 소소한 스킬/C#
반응형

LINQ는 사용을 해봤고..

 

그렇다면.. LINQ문은 Where 문, select문만 존재하는것인가?

 

아니다..

 

종류는 이렇게 많다

Operator Category LINQ Query Operators Names
Filtering Where, OfType
Sorting OrderBy, OrderByDescending, ThenBy, ThenByDescending
Set Except, Intersect, Union, Distinct
Quantifier All, Any, Contains
Projection Select, SelectMany
Partitioning Skip, SkipWhile, Take, TakeWhile
Join Join, GroupJoin
Grouping GroupBy, ToLookup
Sequencing DefaultIfEmpty, Empty, Range, Repeat
Equality SequenceEqual
Element ElementAt, ElementAtOrDefault, First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefault
Conversion AsEnumerable, AsQueryable, Cast, OfType, ToArray, ToDictionary, ToList, ToLookup
Concatenation Concat
Aggregation Aggregate, Average, Count, LongCount, Max, Min, Sum

 

나도 이 많은 것들은 다 사용해보진 않았고... 그냥 자주사용하는것만 아주 가아끔 사용한다.

(LINQ가 아직도 어색한 초보 개발자다....)

 

기본적으로 깔고가는 코드는 아래와 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace TestProject
{
    class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
 
 
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
 
            List<Student> students = new List<Student>();
            students.Add(new Student
            {
                ID = 1,
                Name = "Kapil"
            });
 
            students.Add(new Student
            {
                ID = 2,
                Name = "James"
            });
 
            students.Add(new Student
            {
                ID = 3,
                Name = "Michael"
            });
 
            students.Add(new Student
            {
                ID = 3,
                Name = "Emily"
            });
 
            students.Add(new Student
            {
                ID = 3,
                Name = "Megan"
            });
 
            students.Add(new Student
            {
                ID = 1,
                Name = "Stephanie"
            });
 
            students.Add(new Student
            {
                ID = 2,
                Name = "Daniel"
            });
 
            students.Add(new Student
            {
                ID = 3,
                Name = "Hunter"
            });
 
            students.Add(new Student
            {
                ID = 3,
                Name = "Joshua"
            });
 
            students.Add(new Student
            {
                ID = 3,
                Name = "Kyle"
            });
 
        }
    }
}
 
Colored by Color Scripter
cs

 

여기서 LINQ로 추출만 색다르게 해줄 것이다.

 

일단..

 

1번 Filtering Operator

 

여기에 Where가 속한다.

 

별거 없다..

 

1
2
3
4
5
6
7
var result = students.Where(s => s.Score > 30).Select(s => s.Name);
 
            tb.Text = string.Empty;
            foreach (var item in result)
            {
                tb.Text += item + Environment.NewLine;
            }
Colored by Color Scripter
cs

 

var result = students.Where(s => s.Score > 30).Select(s => s.Name);

"30점 이상인놈들의 이름을 뽑아라"

인거다...

 

결과는...

 

02. Sorting Operator

Sorting이 무엇인가.. 그냥 정렬하는거다..

 

1
2
3
4
5
6
7
 var result = students.OrderByDescending(s => s.Score).Select(s => string.Format("{0}/{1}", s.Name, s.Score));
 
            tb.Text = string.Empty;
            foreach (var item in result)
            {
                tb.Text += item + Environment.NewLine;
            }
Colored by Color Scripter
cs

 

간단.! 내림 차순하려면 그냥 OrderBy를 쓰면된다.

 

03. Set Operator

Set은 나도 잘 사용하지 않는다.. 사용을 해봐야 Distinct 정도?

 

Disctinct는 중복제거.. 샘플엔 중복되는 데이터가 없어서... 중복제거가 되진 않지만.. 대충 사용방법을 적으면

 

1
2
3
4
5
6
7
var result = students.Distinct().Select(s => s.Name);
 
            tb.Text = string.Empty;
            foreach (var item in result)
            {
                tb.Text += item + Environment.NewLine;
            }
Colored by Color Scripter
cs

 

이런식으로 사용하면 된다.

결과는

 

이렇게 10명의 학생이 다 나온다(중복이 없기에)

 

04. Quantifier Operation

양을 선택하는 것이다.. 이 Operator를 진짜 많이 사용할 것으로 생각된다.

 

All, Any, Contains가 존재하며 3가지 코드의 사용법으로는

1
2
3
4
5
6
7
8
9
10
11
12
/// 모든 학생이 50점이 넘느냐?
            var result = students.All(s => s.Score > 50);
            tb.Text = result.ToString();
 
            /// 50점이 넘는 학생이 존재하느냐?
            result = students.Any(s => s.Score > 50);
            tb.Text = result.ToString();
 
            /// 50점 맞은 학생이 존재하느냐.
            /// 비교 구문에 해당되는 정보를 추가로 작성해주어야 함
            result = students.Contains(new Student() { Score = 50 }, new StudentScoreComparer());            
            tb.Text = result.ToString();
Colored by Color Scripter
cs

 

Contain은 사용법이 좀 어렵다... 그냥 Where문을 사용하자.... 만약 Contains을 사용한다면 아래클래스도 필요하다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class StudentScoreComparer : IEqualityComparer<Student>
    {
        public bool Equals(Student x, Student y)
        {
            if (string.Equals(x.Score.ToString(), y.Score.ToString(), StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
            return false;
        }
        public int GetHashCode(Student obj)
        {
            return obj.Score.GetHashCode();
        }
    }
Colored by Color Scripter
cs

 

05. Projection Operator

이것 또한 많이 사용할 것이다.

 

선택하는 Operator.. 이전에 Filter나 Sort에서 사용했기에..여기선 패쓰하자..

 

06. Partitioning Operator

이것또한 선택하는 Operator..

string의 substring을 생각하면 쉽게 생각이 가능할것으로 판단된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var result = students.Take(3).Select(s =&gt; s.Name);
 
            tb.Text = string.Empty;
            foreach (var item in result)
            {
                tb.Text += item + Environment.NewLine;
            }
 
            /// 조건(Score가 91보다 작은것)에 해당되는 것을 모두 표출하다 조건이 안맞으면 끝낸다
            result = students.TakeWhile(s =&gt; s.Score &lt; 91).Select(s =&gt; s.Name);
 
            tb.Text = string.Empty;
            foreach (var item in result)
            {
                tb.Text += item + Environment.NewLine;
            }
 
 
            /// 0번째부터 3개를 제외하고 가져온다.
            result = students.Skip(3).Select(s =&gt; s.Name);
            tb.Text = string.Empty;
            foreach (var item in result)
            {
                tb.Text += item + Environment.NewLine;
            }
 
            /// 조건(Score가 91보다 작은것)에 해당되는 것 이후의 정보를 표출한다.
            result = students.SkipWhile(s =&gt; s.Score &lt; 91).Select(s =&gt; s.Name);
            tb.Text = string.Empty;
            foreach (var item in result)
            {
                tb.Text += item + Environment.NewLine;
            }
Colored by Color Scripter
cs

 

07. Element Operator

Elemenet Operator다.. 이것또한 select로 생각하면 된다.

 

첫번째꺼, 마지막꺼, 특정번째꺼를 가져올수 있게한다.

 

제일 간단.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// 첫번째 학생을 가져온다.
            var result = students.First();
            tb.Text = result.Name;
 
            /// 마지막 학생을 가져온다.
            result = students.Last();
            tb.Text = result.Name;
 
            /// 50점이 넘는 첫번째 학생을 가져온다.
            result = students.FirstOrDefault(s => s.Score > 50);
            tb.Text = result.Name;
 
            /// 50점이 넘는 마지막 학생을 가져온다.
            result = students.LastOrDefault(s => s.Score > 50);
            tb.Text = result.Name;
 
            /// 5번째 학생을 가져온다.
            result = students.ElementAt(5);
            tb.Text = result.Name;
cs

 

08.Aggregation Operator

숫자놀이 Operator라고 생각하믄 된다.

1
2
3
4
5
6
7
8
9
10
11
 /// 가장 작은 수
            var result = students.Min(s => s.Score);
            tb.Text = result.ToString();
 
            /// 가장 큰 수
            result = students.Max(s => s.Score);
            tb.Text = result.ToString();
            
            /// 평균
            double d_result = students.Average(s => s.Score);
            tb.Text = d_result.ToString();
cs

 

몇개는 빼먹었는데.... 그건 좀 해보면 될 것같.... ㅎㅎ

 

코드는

TestProject.zip
0.09MB

반응형
'사소한 아이의 소소한 스킬/C#' 카테고리의 다른 글
  • 018. Style Trigger
  • 017. ViewBox
  • 013. LINQ Query/Method Syntax
  • 016. Window - UserControl 간 파라미터 전달
JOOJI
JOOJI
그냥 혼자좋아하는 것들 남기는 블로그....
  • JOOJI
    사소한프로그래머의 소소한행복
    JOOJI
  • 전체
    오늘
    어제
    • 분류 전체보기 (951) N
      • 사소한 아이의 소소한 일상 (245)
      • 사소한 아이의 소소한 먹거리 (43)
      • 사소한 아이의 소소한 정보 (75) N
      • 사소한 아이의 소소한 감사 (4)
      • 사소한 아이의 소소한 운동 (53) N
      • 사소한 아이의 소소한 여행 (40)
        • 2013_전주 (1)
        • 2014_독일 (13)
        • 2014_군산 (1)
        • 2015_제주도 (3)
        • 2015_서울모토쇼 (3)
        • 2015_진해 (1)
        • 2015_전주 (1)
        • 2016_여수 (1)
        • 2020_강릉 (1)
        • 2022_제주도 (4)
      • 사소한 아이의 소소한 강짱 (22)
        • 하트투하트 (10)
        • MAPS (1)
        • 화려한 유혹 (2)
        • 한여름의 추억 (2)
      • 사소한 아이의 TV (50)
        • Drama (9)
        • 예능 (32)
        • 사소한 아이의 다현 (9)
      • 사소한 아이의 소소한 스킬 (130)
        • Scaleform (2)
        • C# (74)
        • QT (3)
        • 알고리즘 (4)
        • Python (21)
        • PyQT5 (9)
        • C_C++ (2)
      • 사소한 아이의 소소한 축구 (283)
        • Korea (25)
        • Germany (45)
        • Bayern Munich (64)
        • Soccer_ETC (75)
        • Euro 2016 (12)
        • 친선경기 (3)
      • 사소한 아이의 소소한 생활정보 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
    • 관리
  • 링크

    • 독일여행
    • 레바티스토리
    • 프라치노 공간
    • 남성패션꿀템 블로그
  • 공지사항

  • 인기 글

  • 태그

    문제
    회사밥
    c#
    python
    독일
    바이에른 뮌헨
    뮌헨
    러닝
    WPF
    분데스리가
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
JOOJI
014. LINQ Query Operators
상단으로

티스토리툴바