014. LINQ Query Operators
반응형

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

반응형