... | @@ -237,6 +237,78 @@ class Program |
... | @@ -237,6 +237,78 @@ class Program |
|
## 5. **LINQ 기본 문법 정리**
|
|
## 5. **LINQ 기본 문법 정리**
|
|
|
|
|
|
**1. where**
|
|
**1. where**
|
|
|
|
LINQ의 where를 통해 `IEnumerable<T>` type인 list collection에서 특정 조건을 만족하는 data를 filtering 할 수 있다. where의 조건절에는 return type으로 bool type을 만족하는 어떤 C#코드도 올 수 있다.
|
|
|
|
|
|
**2. orderby**
|
|
**2. orderby**
|
|
|
|
orderby를 이용해 정렬 작업을 수행할 수 있다. 기본적으로 `orderby person.Age ascending`(올림차순)으로 정렬하지만 `orderby person.Age descending`(내림차순)으로 정렬 할 수 있다.
|
|
|
|
|
|
**3. group by**
|
|
**3. group by**
|
|
**4. join** |
|
LINQ의 group by는 지정된 값을 기준으로 collection의 요소를 그룹으로 분류하고 최종적으로 모든 그룹의 collection을 반환한다. group by의 가능이 select를 담당하고 있기 때문에 select 구문이 올 수 없다.
|
|
\ No newline at end of file |
|
|
|
|
|
**4. join**
|
|
|
|
LINQ의 join은 data collection 중에서 on equal 조건을 만족하는 요소끼리 묶어 반환하는 기능을 제공한다. on equal은 조건을 만족하는 record가 없다면 제외시킨다. 이러한 join 유형을 Inner join이라고 한다. LINQ에는 Outer join에 대한 keyword는 별도로 없고 아래 그림과 같이 collection을 후처리하는 방법을 사용한다.
|
|
|
|
|
|
|
|
``` cs
|
|
|
|
List<Person> people = new List<Person>
|
|
|
|
{
|
|
|
|
new Person { Name = "Tom", Age = 63, Hometown = "Korea" },
|
|
|
|
new Person { Name = "Ellie", Age = 23, Hometown = "Tibet" },
|
|
|
|
new Person { Name = "Suji", Age = 30, Hometown = "Sudan" },
|
|
|
|
new Person { Name = "Zulla", Age = 35, Hometown = "Korea" },
|
|
|
|
new Person { Name = "Anders", Age = 44, Hometown = "Korea" },
|
|
|
|
new Person { Name = "Hans", Age = 24, Hometown = "Sudan" },
|
|
|
|
};
|
|
|
|
|
|
|
|
List<MainLanguage> languages = new List<MainLanguage>
|
|
|
|
{
|
|
|
|
new MainLanguage { Name = "Tom", Language = "C" },
|
|
|
|
new MainLanguage { Name = "Ellie", Language = "C#" },
|
|
|
|
new MainLanguage { Name = "Anders", Language = "C++" },
|
|
|
|
new MainLanguage { Name = "Hans", Language = "Java" },
|
|
|
|
};
|
|
|
|
|
|
|
|
var groupTemp = from person in people
|
|
|
|
join language in languages on person.Name equals language.Name into lang
|
|
|
|
from language in lang.DefaultIfEmpty(new MainLanguage())
|
|
|
|
select new
|
|
|
|
{
|
|
|
|
Name = person.Name,
|
|
|
|
Age = person.Age,
|
|
|
|
Language = language.Language
|
|
|
|
};
|
|
|
|
```
|
|
|
|
join으로 languages collection의 내용을 lang이라는 이름의 임시 collection으로 보낸 후 개별 요소에 대해 IEnumerable<T> type의 DefaultIfEnpty Extension method를 호출한다.
|
|
|
|
* **into keyword**
|
|
|
|
추가적인 query operation을 수행하고 싶으면 임시 식별자인 into를 지정할 수 있다. into를 사용하면 query를 계속 해야하고 select statement에서 끝내야 한다.
|
|
|
|
|
|
|
|
## 6. **코드분석**
|
|
|
|
``` cs
|
|
|
|
var groupTemp = from data in TxPowerItems
|
|
|
|
group data by data.Path into newData
|
|
|
|
orderby newData.Key
|
|
|
|
select new
|
|
|
|
{
|
|
|
|
Key = newData.Key,
|
|
|
|
Temps = newData.ToList()
|
|
|
|
};
|
|
|
|
|
|
|
|
// TxPowerItems를 data.Path로 group화하고 newData인 임시 collection으로 보낸다.
|
|
|
|
// newData의 Key값 즉, data.Path를 ascending 정렬한다.
|
|
|
|
// select를 사용해 Key, Temps로 형변환된 IEnumerable를 반환한다.
|
|
|
|
```
|
|
|
|
**질문) groupTemp 변수는 어떤 형태의 값이 채워지나요?**
|
|
|
|
|
|
|
|
{ Key = PmPowerItem의 Path값, Temps = List<PmPowerItem>**(해당 Key(Path)값에 해당하는 PmPowerItem class의 list)**} 의 값으로 채워집니다.
|
|
|
|
|
|
|
|
>예)
|
|
|
|
{ Key = 2.경기도-성남시-Probe_00, Temps = List<PmPowerItem> }
|
|
|
|
{ Key = 2.경기도-성남시-관양로L0_예비, Temps = List<PmPowerItem> }
|
|
|
|
|
|
|
|
List값인 Temps는 아래와 같이 접근할 수 있다.
|
|
|
|
``` cs
|
|
|
|
foreach (var data in groupTemp)
|
|
|
|
{
|
|
|
|
foreach (PmPowerItem elem in data.Temps)
|
|
|
|
Console.WriteLine("{0}, {1}, {2}", elem.Number, elem.Type, elem.ProbeId);
|
|
|
|
}
|
|
|
|
``` |