다음 리스트를 기준으로 예제를 진행합니다.
List<OrderMenu> Menus = new List<OrderMenu>();
Menus.Add(new OrderMenu { MenuId = 1, OrderId = 1, MenuName = "샐러드", MenuCnt = 2 });
Menus.Add(new OrderMenu { MenuId = 2, OrderId = 1, MenuName = "아이스아메리카노", MenuCnt = 4 });
Menus.Add(new OrderMenu { MenuId = 3, OrderId = 1, MenuName = "에그샌드위치", MenuCnt = 1 });
Menus.Add(new OrderMenu { MenuId = 4, OrderId = 1, MenuName = "치킨샌드위치", MenuCnt = 2 });
Menus.Add(new OrderMenu { MenuId = 5, OrderId = 2, MenuName = "짬뽕", MenuCnt = 1 });
Menus.Add(new OrderMenu { MenuId = 6, OrderId = 2, MenuName = "짜장면", MenuCnt = 3 });
4. Grouping Operators(그룹 연산자)
:그룹화 연산자는 지정된 키를 기반으로 요소 그룹을 작성합니다.
- GroupBy : 선택 필드로 collection을 그룹화합니다.
- ToLookup : GroupBy와 거의 같으나, GroupBy는 **지연 실행이며, ToLokkup은 즉시 실행됩니다.
var usetGroupByMenu = Menus.GroupBy(o => o.OrderId);
foreach (var menu in usetGroupByMenu)
{
Console.WriteLine($"OrderId : {menu.Key} ");
int memcnt = 1;
foreach (var member in menu)
{
Console.WriteLine($" Member {memcnt++} :" + JsonConvert.SerializeObject(member) );
}
}
//==========================================OUTPUT=========================================
//OrderId : 1
// Member 1 :{"MenuId":1,"OrderId":1,"MenuName":"샐러드","MenuCnt":2,"Options":[]}
// Member 2 :{"MenuId":2,"OrderId":1,"MenuName":"아이스아메리카노","MenuCnt":4,"Options":[]}
// Member 3 :{"MenuId":3,"OrderId":1,"MenuName":"에그샌드위치","MenuCnt":1,"Options":[]}
// Member 4 :{"MenuId":4,"OrderId":1,"MenuName":"치킨샌드위치","MenuCnt":2,"Options":[]}
//OrderId : 2
// Member 1 :{"MenuId":5,"OrderId":2,"MenuName":"짬뽕","MenuCnt":1,"Options":[]}
// Member 2 :{"MenuId":6,"OrderId":2,"MenuName":"짜장면","MenuCnt":3,"Options":[]}
*초기화 지연
: 개체 초기화 지연은 개체를 처음 사용할 때까지 생성이 지연된다는 의미 입니다.
초기화 지연은 주로 성능을 향상 시키고 불필요한 계산을 방지하고 프로그램 메모리 요구 사항을 줄이는데 사용됩니다.
만드는데 비용이 많이 드는 개체가 있으며, 프로그램에서 이 개체를 사용하지 않는 경우가 있습니다(ex. Orders). 사용자는 주문을 표시하거나 계산에서 데이터를 사용하도록 요청하지 않으면 시스템 메모리 또는 계산 주기를 사용하여 만들 이유가 없습니다. Lazy<Orders>를 사용하여 Orders개체의 초기화 지연을 선언하면 개체를 사용하지 않을 때 시스템 리소스 낭비를 방지할 수 있습니다.
Lazy<Orders> _orders = new Lazy<Orders>();
지연 개체를 만들고 나면 지연 변수의 Value 속성에 처음으로 액세스할 때까지 Orders의 인스턴스가 생성되지 않습니다. 처음 액세스할 때 래핑된 형식이 생성되고 반환되며 나중에 액세스하는 데 사용하기 위해 저장됩니다.
5. Joining Operator(조인 연산자)
:두 시퀀스를 결합합니다
다음은 Joining Operator 예시에 사용될 추가 조합 입니다.
List<OrderOption> orderOptions = new List<OrderOption>();
orderOptions.Add(new OrderOption { MenuId = 2, OptionId = 1, OptionName = "헤이즐넛 시럽추가", OptionCnt = 1 });
orderOptions.Add(new OrderOption { MenuId = 2, OptionId = 2, OptionName = "사이즈업", OptionCnt = 1 });
- Join : 두 시퀀스를 InnerJoin으로 결합하고 결과를 생성합니다.
var innerJoin = Menus.Join( //outer sequence
orderOptions, //inner sequnce
menus => menus.MenuId, //outerKeySelector
options => options.MenuId, //innerKeySelector
(menus, options) => new OrderMenu
{
MenuId = menus.MenuId,
MenuName = menus.MenuName,
OrderId = menus.OrderId,
Options = new List<OrderOption> { options },
}); ;//result selector
foreach (var menu in innerJoin)
Console.WriteLine(JsonConvert.SerializeObject(menu));
//==========================================OUTPUT=========================================
//{"MenuId":2,"OrderId":1,"MenuName":"아이스아메리카노","MenuCnt":0,"Options":[{"OptionId":1,"MenuId":2,"OptionName":"헤이즐넛 시럽추가","OptionCnt":1}]}
//{"MenuId":2,"OrderId":1,"MenuName":"아이스아메리카노","MenuCnt":0,"Options":[{"OptionId":2,"MenuId":2,"OptionName":"사이즈업","OptionCnt":1}]}
- GroupJoin : 키에 따라 두 시퀀스를 조인하고 일치하는 키로 결과를 그룹화한 다음 그룹화된 결과 및 키의 컬렉션을 반환합니다.
var groupJoin = Menus.GroupJoin(
orderOptions,
menu => menu.MenuId,
option => option.MenuId,
(menu, resultGroup) => new
{
Menus = resultGroup,
MenuInfo = menu
});
foreach (var menu in groupJoin)
{
Console.WriteLine(" ▶ Menu : " + groupjoinmenu.MenuInfo.MenuName);
foreach (var option in menu.Menus)
{
Console.WriteLine(" + "+ JsonConvert.SerializeObject(option));
}
}
//==========================================OUTPUT=========================================
// ▶ Menu : 샐러드
// ▶ Menu : 아이스아메리카노
// + {"OptionId":1,"MenuId":2,"OptionName":"헤이즐넛 시럽추가","OptionCnt":1}
// + {"OptionId":2,"MenuId":2,"OptionName":"사이즈업","OptionCnt":1}
// ▶ Menu : 에그샌드위치
// ▶ Menu : 치킨샌드위치
// ▶ Menu : 짬뽕
// ▶ Menu : 짜장면
'C#' 카테고리의 다른 글
[C#] Linq 3. 투영 연산자, 정량자 연산자 (0) | 2022.01.23 |
---|---|
[C#] Linq 1.필터링, 정렬 연산자 (0) | 2022.01.09 |