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 => s.Name);
tb.Text = string.Empty;
foreach (var item in result)
{
tb.Text += item + Environment.NewLine;
}
/// 조건(Score가 91보다 작은것)에 해당되는 것을 모두 표출하다 조건이 안맞으면 끝낸다
result = students.TakeWhile(s => s.Score < 91).Select(s => s.Name);
tb.Text = string.Empty;
foreach (var item in result)
{
tb.Text += item + Environment.NewLine;
}
/// 0번째부터 3개를 제외하고 가져온다.
result = students.Skip(3).Select(s => s.Name);
tb.Text = string.Empty;
foreach (var item in result)
{
tb.Text += item + Environment.NewLine;
}
/// 조건(Score가 91보다 작은것)에 해당되는 것 이후의 정보를 표출한다.
result = students.SkipWhile(s => s.Score < 91).Select(s => 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 |
몇개는 빼먹었는데.... 그건 좀 해보면 될 것같.... ㅎㅎ
코드는