15-1.Äõ¸® Ç¥Çö½Ä

15-1-1.ÅëÇÕµÈ ÁúÀÇ

LINQ(Language INtegrated Query)´Â ¾ð¾î µ¶¸³ÀûÀÎ ÁúÀǹ®ÀÌ¸ç µ¥ÀÌÅ͸¦ ´Ù·ç´Â »õ·Î¿î ¹æ¹ýÀÌ´Ù. ÇÁ·Î±×·¥Àº µ¥ÀÌÅÍ°¡ ÀÖ¾î¾ß µ¿ÀÛÇÏ¸ç µ¥ÀÌÅ͸¦ °ü¸®ÇÏ´Â °ÍÀÌ ÁÖµÈ ÀÓ¹«ÀÌ´Ù. ´ë¿ë·®ÀÇ µ¥ÀÌÅÍ´Â º¸Åë ¼­¹ö°¡ °ü¸®ÇÏ°í ÇÁ·Î±×·¥Àº ¼­¹öÀÇ µ¥ÀÌÅ͸¦ È°¿ëÇÑ´Ù. Äõ¸®´Â ¿øÇÏ´Â µ¥ÀÌÅ͸¦ °Ë»öÇÏ´Â Áö½Ã»çÇ×ÀÌ´Ù. DB ¼­¹ö¿¡°Ô ¿øÇÏ´Â Á¶°ÇÀ» Àü´ÞÇϸé Áö½Ã´ë·Î µ¥ÀÌÅ͸¦ ±¸ÇØ ¸®ÅÏÇÑ´Ù. µ¥ÀÌÅ͸¦ Àб⸸ ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÇÊÅ͸µ, Á¤·Ä, ±×·ìÇÎ µîÀÇ Ã³¸®±îÁö Æ÷ÇÔÇÑ´Ù. LINQ´Â ÀÌ·± ÀÛ¾÷À» Ŭ¶óÀ̾ðÆ® ¾ð¾î¿¡ ÅëÇÕÇÑ´Ù.

LINQ´Â ¾ð¾î¿¡ µ¶¸³ÀûÀÌ´Ù. ¿©±â¼­ ¾ð¾î´Â ÀÌÁßÀÇ Àǹ̸¦ °¡Áö´Âµ¥ Äõ¸® ´ë»óÀÎ µ¥ÀÌÅÍ ¼Ò½º¸¦ ĪÇϱ⵵ ÇÏ°í Äõ¸® ½ÇÇà ¾ð¾î¸¦ ĪÇϱ⵵ ÇÑ´Ù. LINQ´Â ¾çÂÊÀ¸·Î ´Ù µ¶¸³ÀûÀÌ´Ù. µ¥ÀÌÅÍ ¼Ò½º¿¡ µû¶ó Äõ¸® ¾ð¾î°¡ ´Ù¸¥µ¥ °ü°èÇü DB´Â SQLÀ» ¾²°í XMLÀº XPath·Î °Ë»öÇÑ´Ù. LINQ´Â µ¥ÀÌÅÍ ¼Ò½º¿¡ µû¶ó ´Ù¼¸ °¡Áö ¹üÁÖÀÇ Äõ¸®¹®À» Á¦°øÇÑ´Ù.

 

LINQ to Object

LINQ to DataSet

LINQ to SQL

LINQ to Entities

LINQ to XML

 

°¢ ¹üÁÖ´Â Äõ¸® ´ë»ó°ú µ¥ÀÌÅÍ ¼Ò½º¸¦ ÁغñÇÏ´Â °úÁ¤¸¸ Á¶±Ý¾¿ ´Ù¸¦ »Ó Äõ¸® ¹®¹ýÀº °°´Ù. ±×·¡¼­ DB¿¡ Äõ¸®ÇÏ´Â ¹æ½ÄÀ» XML ¹®¼­³ª Ä÷º¼Ç¿¡ ±×´ë·Î Àû¿ëÇÒ ¼ö ÀÖ´Ù. SQLµµ Ç¥ÁØÀÌ°í XPathµµ Ç¥ÁØÀε¥ LINQ´Â ÀÌ·± Ç¥ÁصéÀ» ÅëÇÕÇÏ·Á´Â ½ÃµµÀÌ´Ù.

Äõ¸® ½ÇÇà ¾ð¾î´Â C#, ºñÁÖ¾ó º£ÀÌÁ÷ µîÀÌ ÀÖ°í ÀÌ·ÐÀûÀ¸·Î ´å³ÝÀÇ ¸ðµç ¾ð¾î¸¦ ¾µ ¼ö ÀÖ´Ù. ¾ð¾î¿¡ µû¶ó Äõ¸® ¹æ¹ýÀÌ ´Þ¶óÁöÁö¸¸ LINQ¸¦ ¾²¸é ¾ð¾î¿¡ »ó°ü¾øÀÌ ¶È°°Àº Äõ¸®¹®À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. 

LINQ´Â ÇÁ·Î±×·¡¹Ö ¾ð¾î¿Í µ¥ÀÌÅÍ ¼Ò½º »çÀÌ¿¡ À§Ä¡Çϸç ÀÓÀÇÀÇ ¾ð¾î·Î ÀÓÀÇÀÇ µ¥ÀÌÅ͸¦ °ü¸®ÇÏ´Â ¹ü¿ë Äõ¸® ±â¼úÀÌ´Ù. LINQÀÇ ÀåÁ¡Àº ´ÙÀ½°ú °°´Ù.

 

l °£°áÇÑ ±¸¹®À¸·Î Äõ¸® ¹æ½ÄÀ» °£¼ÒÈ­ÇÑ´Ù. ²À ÇÊ¿äÇÑ Áö½Ã »çÇ׸¸ ¹àÇô ¿øÇÏ´Â µ¥ÀÌÅ͸¦ °£ÆíÇÏ°Ô ¾òÀ» ¼ö ÀÖ´Ù.

l µ¥ÀÌÅÍ ¼Ò½º¿¡ »ó°ü¾øÀÌ ÀÏ°üµÈ Äõ¸® ¹®¹ýÀÌ Àû¿ëµÈ´Ù. ÅëÇÕÀ» ÁöÇâÇϸç ÇÑ ¹ø ¹è¿öµÎ¸é ¾îµð¿¡¼­³ª ½á ¸ÔÀ» ¼ö ÀÖ´Ù.

l °´Ã¼ÁöÇâÀûÀÌ´Ù. °ü°èÇü µ¥ÀÌÅͺ£À̽º´Â °´Ã¼ÁöÇâ°ú °Å¸®°¡ ¸ÖÁö¸¸ LINQ´Â °´Ã¼ÁöÇâÀÇ ÀÌÁ¡À» È°¿ëÇÏ¿© »ý»ê¼ºÀÌ ³ô°í ¾ÈÁ¤ÀûÀÌ´Ù.

l °­·ÂÇÑ Å¸ÀÔÀ» Áö¿øÇÏ¸ç ¸ðµç ¿¡·¯¸¦ ÄÄÆÄÀÏÁß¿¡ Á¡°ËÇÒ ¼ö ÀÖ¾î ½Å¼ÓÇÏ°í ¾ÈÁ¤ÀûÀÌ´Ù. ÀÎÅÚ¸®¼¾½º¿Í µð¹ö°ÅÀÇ ÀüÆøÀûÀÎ µµ¿òÀ» ¹ÞÀ» ¼ö ÀÖ´Ù.

 

´å³ÝÀº LINQ Áö¿øÀ» À§ÇØ Å¸ÀÔ Ãß·Ð, À͸í ŸÀÔ, È®Àå ¸Þ¼­µå, ¶÷´Ù µîÀÇ ¹®¹ýÀ» µµÀÔÇß´Ù. °í±Þ ¹®¹ýÀÇ ÀÌÁ¡À» ÃæºÐÈ÷ È°¿ëÇÏ¿© °£°áÇÑ ±¸¹®À¸·Î º¹ÀâÇÑ Äõ¸®¸¦ Áö½ÃÇÒ ¼ö ÀÖ´Ù. ´ë½Å ÇÔÃàÀûÀÌ¸ç ³­À̵µ°¡ ³ô¾Æ ±âº» ¹®¹ýÀ» ¼÷ÁöÇØ¾ß Á¦´ë·Î ÀÌÇØÇÒ ¼ö ÀÖ´Ù.

LINQ ÀÚü´Â Àб⸸ ÇÏ¸ç µ¥ÀÌÅ͸¦ º¯°æÇÏ´Â ±â´ÉÀº ¾øÁö¸¸ ÅëÇÕµÈ ¾ð¾îÀÇ ±â´ÉÀ» È°¿ëÇÏ¸é ¼öÁ¤À̳ª ÷»èµµ °¡´ÉÇÏ´Ù. °Ë»öÀº LINQ·Î ÇÏ°í ¼¶¼¼ÇÑ Á¶ÀÛÀº ¾ð¾î·Î ÇÒ ¼ö ÀÖ¾î »ó»óÇÏ´Â ¸ðµç °ÍÀ» ´Ù ÇÒ ¼ö ÀÖÀ¸¸ç ¾ð¾î³»¿¡¼­ ÀÏ°ý 󸮰¡ °¡´ÉÇÏ´Ù. LINQ´Â È®½ÇÈ÷ »õ·Ó°í ½Å¼±ÇÑ ½ÃµµÀÌ¸ç ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®°¡ ÀÚ¶ûÇÒ¸¸ ÇÏ´Ù. ¼¼»ó¿¡¼­ Á¦ÀÏ ÁÁÀº Äõ¸® ¹æ¹ýÀ¸·Î ±¤°íÇÏÁö¸¸ ¾×¸é ±×´ë·Î ´Ù ¹ÏÀ» ¼ö´Â ¾ø´Ù. ³ÃÁ¤ÇÏ°Ô º¸¸é °úÀåÀÌ ¸¹°í Å»ýÀûÀÎ ÇÑ°èµµ ÀÖ´Ù.

 

l ¼­¹ö°¡ ºÐ´ãÇÏ´ø ÀÛ¾÷À» Ŭ¶óÀ̾ðÆ®°¡ ¶° ¸Ã´Â ±¸Á¶ÀûÀÎ °áÇÔÀÌ ÀÖ´Ù. ºÐ»ê ȯ°æÀÇ ÀÌÁ¡ÀÌ »ó¼âµÇ°í Áß¾Ó ÁýÁßÀûÀÎ °ü¸®°¡ ¾î·Æ´Ù.

l ¾ð¾î ÅëÇÕÀº ÇÑ°è°¡ ÀÖ´Ù. ±¸Á¶°¡ ´Ù¸¥ °ü°èÇü DB¿Í XMLÀÇ Äõ¸® ¹æ¹ýÀº ´ç¿¬È÷ ´Ù¸£´Ù. ¾ïÁö·Î ÅëÇÕÇÏ¸é ¼º´ÉÀ» ´ãº¸Çϱ⠾î·Æ´Ù. ¼ö½Ê³â°£ ÃÖÀûÈ­ÇÑ SQLÀ» ´Ü¼û¿¡ µû¶óÀâ´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù.

l ¹è¿ì±â ½±´Ù°í Çϴµ¥ °áÄÚ ½±Áö ¾Ê´Ù. ÇÑ ¹ø ¹è¿ö µÎ¸é È°¿ë ¹üÀ§°¡ ³ÐÁö¸¸ ¹«¾ùÀ̵ç ÇÑ ¹ø Á¦´ë·Î ¹è¿ì±â°¡ ¾î·Æ´Ù.

 

Àǵµ¿Í ±âȹÀº ÈǸ¢ÇÏ°í ½ÇÁ¦ ±¸ÇöÀ» º¸¸é ÀáÀç·ÂÀÌ »ó´çÇÏ´Ù. ±×·¯³ª °æÀï »ó´ëµµ °áÄÚ ¸¸¸¸Ä¡ ¾Ê¾Æ °íÀüÀüÀÎ ¹æ¹ýÀ» ¿ÏÀü ´ëüÇÒ Á¤µµ·Î Æı«ÀûÀÌÁö´Â ¾Ê´Ù. °á±¹ LINQ´Â ´ëÅëÇÕÀ» ´Þ¼ºÇϱ⺸´Ù´Â ¼ö¸¹Àº Äõ¸® ¹æ¹ýÁßÀÇ Çϳª°¡ µÉ °ø»êÀÌ Å©´Ù.

15-1-2.µ¥ÀÌÅÍ ¼Ò½º

LINQ´Â ÅëÇÕÀ» Ç¥¹æÇÏ°í Àִ¸¸Å­ µ¥ÀÌÅÍ ¼Ò½ºÀÇ ¹üÀ§°¡ ³Ð´Ù. ±×·¸´Ù°í ¾Æ¹« µ¥ÀÌÅͳª ´Ù µÇ´Â °ÍÀº ¾Æ´Ï°í ÃÖ¼ÒÇÑ ¿­°Å´Â °¡´ÉÇØ¾ß ÇÑ´Ù. IEnumerable<T> ¶Ç´Â ÆÄ»ý ÀÎÅÍÆäÀ̽ºÀÎ IQueryable<T>¸¦ Áö¿øÇØ¾ß Çϸç ÀÌ Á¶°ÇÀ» ¸¸Á·ÇØ¾ß Äõ¸® °¡´É ŸÀÔ(Queryable Type)ÀÌ´Ù.

foreach·Î ¼øȸ °¡´ÉÇϸé Äõ¸®µµ °¡´ÉÇÏ´Ù. µ¥ÀÌÅ͸¦ ¼ø¼­´ë·Î Àоî¾ß Á¶°Ç¿¡ ¸Â´Â µ¥ÀÌÅ͸¦ ã¾Æ³¾ ¼ö ÀÖÀ¸´Ï ¼øȸ´Â ²À ÇÊ¿äÇÏ´Ù. ¹è¿­À̳ª Ä÷º¼ÇÀº ¿­°Å °¡´ÉÇØ ¿ä°ÇÀ» ¸¸Á·ÇÑ´Ù. ·¹ÄÚµåÀÇ ÁýÇÕÀÎ °ü°èÇü DB³ª ¿¤¸®¸ÕÆ®ÀÇ ÁýÇÕÀÎ XMLµµ °°Àº ŸÀÔÀÇ ¿ä¼Ò°¡ ¸ðÀÎ ¹è¿­ÀÌ¸ç ¼ø¼­°¡ ÀÖ¾î ¿­°Å °¡´ÉÇÏ´Ù.

°ü°èÇü DB³ª XML ¹®¼­´Â ȯ°æ ¼³Á¤ÀÌ ¹ø°Å·Î¿ö ¸Þ¸ð¸®³»ÀÇ Ä÷º¼ÇÀ» ´ë»óÀ¸·Î LINQ ½Ç½ÀÀ» ÁøÇàÇϱâ·Î ÇÑ´Ù. Ä÷º¼ÇÀ» ´ë»óÀ¸·Î LINQÀÇ ±âº» ¿ø¸®¸¦ ÀÍÈ÷¸é ´Ù¸¥ µ¥ÀÌÅÍ ¼Ò½ºµµ ¶È°°Àº ¹æ¹ýÀ¸·Î ´Ù·ê ¼ö ÀÖ´Ù.

 

LinqArray

½ÇÇà°á°ú

using System;

using System.Collections.Generic;

using System.Linq;

 

class CSTest {

             static void Main() {

                           int[] ar = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

                           IEnumerable<int> Query = from n in ar where (n % 3 == 0) select n;

                           foreach (int k in Query) {

                                        Console.WriteLine(k);

                           }

             }

}

3

6

9

 

LINQ¸¦ »ç¿ëÇÏ·Á¸é µÎ °³ÀÇ using ¼±¾ðÀÌ ÇÊ¿äÇÏ´Ù. °á°ú¼ÂÀÌ Ä÷º¼ÇÀ̾ using Generic ¼±¾ðÀÌ ÇÊ¿äÇÏ°í using Linq¼±¾ð¿¡ ÀÇÇØ LINQ Áö¿ø È®Àå ¸Þ¼­µå°¡ ÀÓÆ÷Æ®µÈ´Ù. ÀÌ ¿¹Á¦´Â Á¤¼ö ¹è¿­ ar¿¡¼­ 3ÀÇ ¹è¼ö¸¸ ã¾Æ Ãâ·ÂÇÑ´Ù. ´ÙÀ½ ¹®ÀåÀÌ ¹Ù·Î Äõ¸®¹®ÀÌ´Ù.

 

from n in ar where (n % 3 == 0) select n

 

SQL¹®°ú Å°¿öµå°¡ ºñ½ÁÇØ Ä£¼÷ÇØ º¸ÀÌÁö¸¸ ¼ø¼­³ª ¹®¹ýÀÌ ´Þ¶ó »ý¼ÒÇÏ´Ù. Äõ¸®¹®Àº IEnumerable<T> ŸÀÔÀ» ¸®ÅÏÇϹǷΠÄõ¸® º¯¼ö¸¦ ÀÌ Å¸ÀÔÀ¸·Î ¼±¾ðÇÑ´Ù. Á¦³×¸¯ ŸÀÔÀÌ º¹ÀâÇØ º¸ÀÎ´Ù¸é ¾Ï¹¬Àû ŸÀÔÀ¸·Î ¼±¾ðÇÒ ¼ö ÀÖ´Ù.

 

var Query = from n in ar where (n % 3 == 0) select n;

foreach (var k in Query)

....

 

ÄÄÆÄÀÏ·¯°¡ Äõ¸®½ÄÀ¸·ÎºÎÅÍ Å¸ÀÔÀ» Ãß·ÐÇÒ ¼ö ÀÖ¾î Äõ¸® º¯¼ö¿Í foreachÀÇ Á¦¾î º¯¼ö¸¦ var·Î ¼±¾ðÇÏ¸é µÈ´Ù. º¹ÀâÇÑ Äõ¸®´Â °á°ú¼ÂÀÇ Å¸ÀÔÀ» ¿¹ÃøÇϱ⠰ï¶õÇϰųª ±ÍÂú¾ÆÁö´Âµ¥ ÀÌ·² ¶§ ¾Ï¹¬Àû ŸÀÔÀÌ Æí¸®ÇÏ´Ù.

µ¥ÀÌÅÍ ¼Ò½ºÀÇ ÃÖ¼Ò ¿ä°ÇÀÌ ¿­°Å °¡´ÉÀ̹ǷΠLINQÀÇ Àû¿ë ºÐ¾ß´Â ±²ÀåÈ÷ ³Ð´Ù. ´ÙÀ½ ¿¹Á¦´Â µð½ºÅ©»óÀÇ ÆÄÀÏ ¸ñ·ÏÀ» LINQ Äõ¸®¹®À¸·Î Á¶»çÇÏ¿© Ãâ·ÂÇÑ´Ù. ÆÄÀÏ ¸ñ·Ïµµ µð½ºÅ©¿¡ ¼ø¼­´ë·Î µé¾î ÀÖ´Â ¹è¿­À̹ǷΠµ¥ÀÌÅÍ ¼Ò½º·Î¼­ ¼Õ»öÀÌ ¾ø´Ù.

 

LinqFile

using System;

using System.Collections.Generic;

using System.Linq;

using System.IO;

 

class CSTest {

             static void Main() {

                           var Files = from f in Directory.GetFiles("c:\\") select f;

                           foreach (var f in Files) {

                                        Console.WriteLine("À̸§ : " + f);

                           }

             }

}

 

Directory.GetFiles ¸Þ¼­µå·Î ·çÆ® µð·ºÅ͸®ÀÇ ÆÄÀÏ ¸ñ·ÏÀ» ±¸ÇØ Ãâ·ÂÇß´Ù. Á¶°ÇÀ» ÁöÁ¤Çϰųª Ãâ·Â ¼ø¼­¸¦ º¯°æÇÒ ¼ö ÀÖ°í ´õ º¹ÀâÇÑ Ã³¸®µµ ¾ó¸¶µçÁö °¡´ÉÇÏ´Ù.

 

l Á¶°Ç¿¡ ¸Â´Â Æú´õÀÇ ÃÑ Å©±â ±¸Çϱâ

l µÎ Æú´õÀÇ ÆÄÀÏ ³»¿ëÀ» ºñ±³ÇÏ¿© º¸°í¼­ Ãâ·ÂÇϱâ

l ¼­ºê µð·ºÅ͸®¸¦ µÚÁ® Áߺ¹µÈ ÆÄÀÏ Ã£±â

 

ÀÌ·± °ÍÀÌ °¡´ÉÇÑ ÀÌÀ¯´Â Äõ¸®°¡ ¾ð¾î¿¡ ÅëÇյǾî ÀÖ¾î Äõ¸®¹®³»¿¡¼­ GetFiles, GetFileLength µîÀÇ ¸Þ¼­µå¸¦ ÀÚÀ¯·Ó°Ô È£ÃâÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¾ð¾îÀÇ ¸ðµç ±â´ÉÀ» ´Ù ±¸»çÇÒ ¼ö ÀÖ¾î È°¿ë¼ºÀÌ ¹«±Ã ¹«ÁøÇÏ´Ù.

15-1-3.Äõ¸® Ç¥Çö½Ä

C#Àº LINQ¸¦ Áö¿øÇϱâ À§ÇØ ¹®¹ýÀÇ ¸¹Àº ºÎºÐÀ» È®ÀåÇߴµ¥ °¡Àå Á÷Á¢ÀûÀÎ È®ÀåÀº Äõ¸® Ç¥Çö½ÄÀÌ´Ù. Äõ¸® Ç¥Çö½ÄÀº ±¸ÇÏ°íÀÚ ÇÏ´Â µ¥ÀÌÅÍ¿Í Ãâ·Â ¹æ½ÄÀ» ÇÔÃàÀûÀ¸·Î ¼³¸íÇÏ´Â ÀÏÁ¾ÀÇ ½ºÅ©¸³Æ®ÀÌ´Ù. ¿©·¯ °³ÀÇ Àý·Î ±¸¼ºµÇ¸ç ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.

fromÀ¸·Î ½ÃÀÛÇؼ­ select³ª groupÀ¸·Î ³¡³ª¸ç ³ª¸ÓÁö´Â ÇÊ¿äÇÒ ¶§¸¸ »ç¿ëÇÏ´Â ¿É¼ÇÀÌ´Ù. °¡Àå °£´ÜÇÑ ÇüÅÂÀÎ from ... select ... ´Â Á¶°Ç¾øÀÌ ¸ðµç µ¥ÀÌÅ͸¦ Àд´Ù. ´ÙÀ½ ¿¹Á¦´Â µ¥ÀÌÅÍ ¼Ò½º·Î »ç¿ëÇÒ °´Ã¼ÀÇ ¹è¿­À» Á¤ÀÇÇÑ´Ù. ÀÌÈÄÀÇ ½Ç½À¿¡µµ °è¼Ó »ç¿ëÇϹǷΠ¸ð¾çÀ» Àß ºÁ µÎÀÚ.

 

LinqPeople

using System;

using System.Collections.Generic;

using System.Linq;

 

class People {

             public People(string aName, int aAge, bool aMale) { Name = aName; Age = aAge; Male = aMale; }

             public string Name;

             public int Age;

             public bool Male;

}

 

class CSTest {

             static void Main() {

                           People[] arPeople = { new People("Á¤¿ì¼º", 36, true), new People("°í¼Ò¿µ", 32,

                                        false) ,new People("¹è¿ëÁØ", 37, true), new People("±èÅÂÈñ", 29, false) };

 

                           IEnumerable<People> Query = from p in arPeople select p;

                           foreach (People k in Query) {

                                        Console.WriteLine("À̸§ : " + k.Name + ", ³ªÀÌ : " + k.Age +

                                                     ", ³²ÀÚ : " + k.Male);

                           }

             }

}

½ÇÇà°á°ú

À̸§ : Á¤¿ì¼º, ³ªÀÌ : 36, ³²ÀÚ : True

À̸§ : °í¼Ò¿µ, ³ªÀÌ : 32, ³²ÀÚ : False

À̸§ : ¹è¿ëÁØ, ³ªÀÌ : 37, ³²ÀÚ : True

À̸§ : ±èÅÂÈñ, ³ªÀÌ : 29, ³²ÀÚ : False

 

½Å»ó Á¤º¸¸¦ ÀúÀåÇÏ´Â People Ŭ·¡½º¸¦ ¼±¾ðÇÏ°í 4¸í¿¡ ´ëÇÑ ½Å»ó Á¤º¸¸¦ arPeople ¹è¿­·Î Á¤ÀÇÇß´Ù. ÀÌ ¹è¿­À» Äõ¸®ÇÏ¿© Àüü ·¹Äڵ带 Ãâ·ÂÇߴµ¥ ÀÌ ¿¹Á¦ÀÇ Äõ¸®¹®À» ´Ù¾çÇÏ°Ô º¯ÇüÇØ º¸¸é¼­ ½Ç½ÀÀ» ÁøÇàÇØ º¸ÀÚ.

fromÀýÀº µ¥ÀÌÅÍ ¼Ò½º¸¦ ÁöÁ¤ÇÑ´Ù. ¸ðµç º¯¼ö´Â »ç¿ëÇϱâ Àü¿¡ ¸ÕÀú ¼±¾ðÇØ¾ß ÇϹǷΠfromÀýÀÌ Á¦ÀÏ ¸ÕÀú ¿Â´Ù. ´ë»óÀ» ¸ÕÀú ¹àÇô¾ß ÀÌÈÄÀÇ Á¶°ÇÀýÀ̳ª Ãâ·ÂÀý¿¡¼­ ÂüÁ¶ÇÒ ¼ö ÀÖÀ¸¸ç ÀÎÅÚ¸®¼¾½ºÀÇ µµ¿òµµ ¹ÞÀ» ¼ö ÀÖ´Ù. fromÀýÀÇ Çü½ÄÀº ´ÙÀ½°ú °°´Ù.

 

from ¼øȸº¯¼ö in µ¥ÀÌÅͼҽº

 

from Å°¿öµå ´ÙÀ½ÀÇ ¼øȸ º¯¼ö(Iteration Variable)´Â ¼Ò½ºÀÇ ¿ä¼Ò¸¦ ¼ø¼­´ë·Î Àд´Ù. from p in arPeopleÀº arPeople ¹è¿­ÀÇ °¢ ¿ä¼Ò¸¦ p·Î ĪÇÑ´Ù´Â ¶æÀ̸ç ÀÌÈÄ p¸¦ »ç¿ëÇÏ¿© Ãâ·Â Á¶°ÇÀ̳ª ¼ø¼­, ´ë»ó µîÀ» ÁöÁ¤ÇÑ´Ù.

¼øȸ º¯¼öÀÇ Å¸ÀÔÀº µ¥ÀÌÅÍ ¼Ò½º·ÎºÎÅÍ Ãß·Ð °¡´ÉÇØ ±»ÀÌ ¹àÈ÷Áö ¾Ê¾Æµµ µÈ´Ù. in arPeopleÀ̶ó°í ÇßÀ¸´Ï ¼øȸ º¯¼ö p´Â ¹è¿­ÀÇ ¿ä¼ÒÀÎ People ŸÀÔÀÓÀÌ ÀÚ¸íÇÏ´Ù. ±×·¯³ª ArrayList °°Àº ºñÁ¦³×¸¯ Ä÷º¼ÇÀº ¿ä¼ÒÀÇ Å¸ÀÔÀÌ ¸íÈ®ÇÏÁö ¾Ê¾Æ ¼øȸ º¯¼öÀÇ Å¸ÀÔÀ» ¹àÇô¾ß ÇÑ´Ù. ´ÙÀ½Àº LinqArray ¿¹Á¦ÀÇ ºñÁ¦³×¸¯ ¹öÀüÀÌ´Ù.

 

LinqArrayList

using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

 

class CSTest {

             static void Main() {

                           ArrayList ar = new ArrayList { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

                           IEnumerable<int> Query = from int n in ar where (n % 3 == 0) select n;

                           foreach (int k in Query) {

                                        Console.WriteLine(k);

                           }

             }

}

 

ArrayList´Â ¿ÀºêÁ§Æ®ÀÇ ¹è¿­ÀÌ¸ç ¿ä¼ÒÀÇ Å¸ÀÔÀº ¸ðµÎ objectÀÌ´Ù. ÀÓÀÇÀÇ Å¸ÀÔÀ» ÀúÀåÇÏ´Ù º¸´Ï ÄÄÆÄÀÏ·¯°¡ arÀÇ ¿ä¼Ò ŸÀÔÀ» Ãß·ÐÇÒ ¼ö ¾ø´Ù. ±×·¡¼­ from n in ar À̶ó°í ¾²¸é ¾ÈµÇ°í nÀÇ Å¸ÀÔÀ» ¹àÇô from int n in ar À̶ó°í ½á¾ß ÇÑ´Ù. select ÀýÀº ¾î¶² °ªÀ» ¾î¶»°Ô Ãâ·ÂÇÒ °ÍÀÎÁö ÁöÁ¤ÇÑ´Ù. ¼øȸ º¯¼ö¸¦ selectÀý¿¡ ÀûÀ¸¸é º¯È¯¾øÀÌ ±×´ë·Î Ãâ·ÂÇ϶ó´Â ¶æÀÌ´Ù. LinqArray ¿¹Á¦´Â ¼øȸ º¯¼ö nÀ» Àû¾î 3ÀÇ ¹è¼öÀÎ 3, 6, 9°¡ Ãâ·ÂµÈ´Ù. selectÀýÀ» ´ÙÀ½°ú °°ÀÌ ¹Ù²ã º¸ÀÚ.

 

from n in ar where (n % 3 == 0) select n * 2;

 

¼øȸ º¯¼ö n¿¡ 2¸¦ °öÇϸé 6, 12, 18ÀÌ Ãâ·ÂµÈ´Ù. LinqPeople ¿¹Á¦¿¡¼­µµ ¼øȸ º¯¼ö p¸¦ ±×´ë·Î Ãâ·ÂÇߴµ¥ ÀϺΠ¸â¹ö¸¸ Ãâ·ÂÇϰųª °¡°øÇÏ¿© Ãâ·ÂÇÒ ¼ö ÀÖ´Ù.

15-1-4.Ç¥ÁØ Äõ¸® ó¸®ÀÚ

C#°ú ºñÁÖ¾ó º£ÀÌÁ÷Àº LINQ¸¦ Áö¿øÇϱâ À§ÇØ Äõ¸® Ç¥Çö½ÄÀ» Ãß°¡Çߴµ¥ ÁúÀÇ ¾ð¾îÀÌ´Ù º¸´Ï ±âÁ¸ ±¸¹®°ú´Â ÀÌÁúÀûÀÌ´Ù. ºÒÇàÈ÷µµ Äõ¸® Ç¥Çö½ÄÀº ¾ð¾îÀÇ ±â´ÉÀÏ »Ó ´å³ÝÀÇ ±â´ÉÀº ¾Æ´Ï¾î¼­ CLRÀÌ ÀνÄÇÏÁö ¸øÇÑ´Ù.

Äõ¸® Ç¥Çö½ÄÀº CLRÀÌ ½ÇÇàÇÒ ¼ö ÀÖ´Â ¸Þ¼­µå È£Ãâ·Î º¯È¯ÇÏ¿© ½ÇÇàÇÑ´Ù. Äڵ带 ½ÇÇàÇÏ´Â ÁÖü°¡ ¸Þ¼­µåÀÌ´Ï ±×·² ¼ö¹Û¿¡ ¾ø´Ù. Äõ¸® ±¸ÇöÀ» À§ÇÑ ¸Þ¼­µå¸¦ Ç¥ÁØ Äõ¸® ó¸®ÀÚ(Standard Query Operators)¶ó°í Çϴµ¥ Äõ¸® Ç¥Çö½Ä ´ë½Å ¸Þ¼­µå¸¦ ¹Ù·Î È£ÃâÇصµ µÈ´Ù.

±×·¯³ª ¸Þ¼­µå´Â ½ºÅ©¸³Æ®¿Í ´Þ¸® ÀåȲÇÏ°í µüµüÇØ Äõ¸® ¿ëµµ·Î ÀûÇÕÇÏÁö ¾Ê´Ù. °¡±ÞÀûÀ̸é Äõ¸® Ç¥Çö½ÄÀ» ¾²µÇ Äõ¸® Ç¥Çö½ÄÀÌ Ã³¸®ÇÏÁö ¸øÇÏ´Â µ¿ÀÛ¿¡ ´ëÇؼ­¸¸ ¸Þ¼­µå¸¦ Á÷Á¢ È£ÃâÇÏ¸é µÈ´Ù. Äõ¸® Ç¥Çö½ÄÀÇ ³»ºÎ µ¿ÀÛÀ» ÀÌÇØÇÏ°í °í±Þ Äõ¸®¸¦ ½ÇÇàÇϱâ À§ÇØ Ç¥ÁØ Äõ¸® ó¸®ÀÚ¸¦ ¿¬±¸ÇØ º¸ÀÚ.

 

from n in ar where (n % 3 == 0) select n

 

ÀÌ Äõ¸®¹®Àº ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ ´ÙÀ½ ¸Þ¼­µå È£Ãâ¹®À¸·Î ¹ø¿ªµÈ´Ù. ÇüŸ¸ ´Ù¸¦ »Ó ¼º´É Â÷ÀÌ´Â ¾øÀ¸¸ç ¿¹Á¦ÀÇ Äõ¸®¹®À» ¸Þ¼­µå È£Ãâ·Î ¹Ù²Ù¾îµµ Àß µ¿ÀÛÇÑ´Ù.

 

ar.Where(x => x % 3 == 0)

 

ÀÌ ¹®ÀåÀ» Áö¿øÇϱâ À§ÇØ µÎ °¡Áö È®Àå ¹®¹ýÀÌ µµÀԵǾú´Ù. ¸ÕÀú Where ¸Þ¼­µåÀÇ Á¤Ã¼¸¦ ¾Ë¾Æº¸ÀÚ. À̸§À¸·Î À¯ÃßÇØ º¸¸é Á¶°Ç ÁöÁ¤¹®ÀÓÀº ÁüÀ۵Ǵµ¥ ÀÌ ¸Þ¼­µåÀÇ ¼Ò¼ÓÀº °ú¿¬ ¾îµðÀϱî? ar. ±îÁö¸¸ ÀÔ·ÂÇØ º¸¸é ÀÎÅÚ¸®¼¾½ºÃ¢À» ÅëÇØ Where ¿Ü¿¡µµ Count, Sum, Max ¸Þ¼­µå°¡ ´õ ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.

¹è¿­¿¡ ÀÌ ¸¹Àº ¸Þ¼­µå¸¦ ÀÏÀÏÀÌ Ãß°¡ÇßÀ» ¸®´Â ¾ø´Ù. ÀÌ ¸Þ¼­µå´Â ¿ÜºÎ¿¡ Á¤ÀÇµÈ È®Àå ¸Þ¼­µåÀÌµÇ ¸¶Ä¡ ÀνºÅϽº ¸Þ¼­µåÀÎ °Íó·³ È£ÃâÇÒ ¼ö ÀÖ´Ù. È®Àå ¸Þ¼­µå°¡ ¾ø´Ù¸é ÇÊ¿äÇÑ ¸Þ¼­µå¸¦ ÀÏÀÏÀÌ Ãß°¡Çϰųª ¾Æ´Ï¸é ¿ÜºÎ¿¡ Á¤ÀÇÇØ ³õ°í ´ÙÀ½°ú °°ÀÌ È£ÃâÇØ¾ß ÇÑ´Ù. 

 

Where(ar, x => x % 3 == 0);

 

°´Ã¼ ¼Ò¼ÓÀÌ ¾Æ´Ï´Ï °´Ã¼·ÎºÎÅÍ È£ÃâÇÒ ¼ö ¾ø°í °´Ã¼¸¦ Àμö·Î ³Ñ°Ü¾ß ÇÑ´Ù. ÇÏÁö¸¸ È®Àå ¸Þ¼­µå´Â °´Ã¼ÀÇ ¸Þ¼­µåó·³ È£ÃâÇÒ ¼ö ÀÖ¾î Á÷°üÀûÀÌ´Ù. Where ¸Þ¼­µåÀÇ ¿øÇüÀº ´ÙÀ½°ú °°´Ù.

 

public static IEnumerable<T> Where<T> (

         IEnumerable<T> source,

         Func<T, bool> predicate

)

 

ù ¹ø° Àμö´Â Á¶°Ç Á¡°ËÀ» ÇÒ µ¥ÀÌÅÍ ¼Ò½ºÀÌ¸ç °á±¹ È£Ãâ °´Ã¼°¡ µÇ´Â ¼ÀÀÌ´Ù. µÎ ¹ø° Àμö´Â Á¶°Ç Á¡°ËÀ» ÇÒ ¸Þ¼­µåÀ̸ç T ŸÀÔÀÇ Àμö¸¦ Çϳª ¹Þ¾Æ TResult ŸÀÔÀ» ¸®ÅÏÇÏ´Â Func µ¨¸®°ÔÀÌÆ® ŸÀÔÀÌ´Ù.

 

public delegate TResult Func<T, TResult> (T arg)

 

Where´Â T ŸÀÔÀÇ ¹è¿­ ¿ä¼Ò¸¦ ¹Þ¾Æ Func ¸Þ¼­µå·Î Àü´ÞÇÏ¿© Á¶°Ç¿¡ ¸Â´Â ¿ä¼Ò¸¸ ¼±º°ÇÑ´Ù.

 

WhereOp

using System;

using System.Collections.Generic;

using System.Linq;

 

class CSTest {

             static bool Is3Times(int x) {

                           return x % 3 == 0;

             }

 

             static void Main() {

                           int[] ar = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

                           var Query = ar.Where(Is3Times);

                           foreach (var k in Query) {

                                        Console.WriteLine(k);

                           }

             }

}

 

Is3Times´Â Á¤¼ö°¡ 3ÀÇ ¹è¼öÀÎÁö Á¶»çÇÑ´Ù. ¿øÇüÀÌ Func µ¨¸®°ÔÀÌÆ® ŸÀÔ°ú °°¾Æ WhereÀÇ µÎ ¹ø° Àμö·Î Àü´ÞÇÒ ¼ö ÀÖ´Ù. Äõ¸®°¡ ½ÇÇàµÉ ¶§ Where´Â arÀÇ °¢ ¿ä¼Ò¿¡ ´ëÇØ Is3Times¸¦ È£ÃâÇÏ°í true¸¦ ¸®ÅÏÇÏ´Â ¿ä¼Ò¸¸ °á°ú¼ÂÀ¸·Î Ãâ·ÂÇÑ´Ù. ÄÚµå´Â ¿Ïº®ÇÏÁö¸¸ Äõ¸®¹®À¸·Î´Â »§Á¡ÀÌ´Ù. ¸Þ¼­µå¸¦ ¹Ì¸® ÁغñÇÏ´Â ¿¹ºñ µ¿ÀÛÀÌ ÇÊ¿äÇØ °£°á¼º°ú´Â °Å¸®°¡ ¸Ö´Ù. Äõ¸®´Â ±æ¾î¼­´Â ¾ÈµÇ¸ç ¾î¶±Çϵç ÇÑÁÙ¿¡ ±¸°Ü ³Ö¾î¾ß ÇÑ´Ù. ÀÌ·± ¿ëµµ·Î ÀÍ¸í ¸Þ¼­µå¸¦ ´ë½Å »ç¿ëÇÒ ¼ö ÀÖ´Ù.

 

var Query = ar.Where(delegate(int x) { return x % 3 == 0; });

 

x¸¦ Àμö·Î ¹Þ¾Æ 3ÀÇ ¹è¼öÀÎÁö Á¶»çÇÏ´Â ÀÍ¸í ¸Þ¼­µå¸¦ Àü´ÞÇÑ´Ù. ¸Þ¼­µåº¸´Ù´Â ÈξÀ ³´Áö¸¸ ¾ÆÁ÷µµ ½ºÅ©¸³Æ®¶ó°í º¸±â¿¡´Â ±æ°í ºÒÆíÇÏ´Ù. ±×·¡¼­ ´õ ª°í ¸í·áÇÏ°Ô Äڵ带 ÀÛ¼ºÇÏ´Â ¶÷´Ù Ç¥Çö½ÄÀ» »õ·Î ¸¸µé¾ú´Ù.

 

var Query = ar.Where(x => x % 3 == 0);

 

¶÷´Ù´Â x¸¦ ¹Þ¾Æ 3ÀÇ ¹è¼öÀÎÁö Á¡°ËÇÑ´Ù. ²À ÇÊ¿äÇÑ ÇÙ½É Äڵ常 ¹àÈ÷¸é µÇ´Ï ª°í °£°áÇØ ½ºÅ©¸³Æ®·Î Á¦°ÝÀÌ´Ù. Å°º¸µå ¸î ¹ø ´ú Ãĵµ µÇ´Â Á¤µµÀÇ Â÷ÀÌ°¡ ¾Æ´Ï¶ó »ç°í°¡ ´Ü¼øÇØÁö°í ¹®Á¦¸¦ Ǫ´Â ¹æ½Ä¿¡ ÁýÁßÇÒ ¼ö ÀÖ¾î »ý»ê¼ºÀÌ Çâ»óµÈ´Ù. ¿Ö ¿Â°® ¿ä»óÇÑ ¹®¹ýÀ» µ¿¿øÇØ°¡¸ç Äڵ带 ¾ÐÃàÇÏ·Á°í ¹ß¹öµÕÀ» ÃÆ´ÂÁö ¾î·ÅDzÀ̳ª¸¶ ÀÌÇØµÉ °ÍÀÌ´Ù. Where ¸Þ¼­µå À§ÁÖ·Î ¿¬±¸ÇØ ºÃ´Âµ¥ ´Ù¸¥ Ç¥ÁØ Äõ¸® ó¸®ÀÚµµ ºñ½ÁÇÑ ¹æ½ÄÀ¸·Î Àû¿ëµÈ´Ù. ´ÙÀ½Àº ÁÖ¿ä Ç¥ÁØ Äõ¸® ó¸®ÀÚ ¸ñ·ÏÀÌ´Ù.

 

¸Þ¼­µå

¼³¸í

Count

°³¼ö¸¦ ±¸ÇÑ´Ù.

Sum

Çհ踦 ±¸ÇÑ´Ù.

Average

Æò±ÕÀ» ±¸ÇÑ´Ù.

Max

ÃÖ´ë°ªÀ» ±¸ÇÑ´Ù.

Min

ÃÖ¼Ò°ªÀ» ±¸ÇÑ´Ù.

OrderBy

¿ä¼ÒµéÀ» Á¤·ÄÇÑ´Ù.

Select

°á°ú¼ÂÀÇ ÇÁ·ÎÁ§¼ÇÀ» »ý¼ºÇÑ´Ù.

Distinct

Áߺ¹À» Á¦°ÅÇÑ´Ù.

Except

Â÷ÁýÇÕÀ» ±¸ÇÑ´Ù.

Intersect

±³ÁýÇÕÀ» ±¸ÇÑ´Ù.

Union

ÇÕÁýÇÕÀ» ±¸ÇÑ´Ù.

All

¸ðµç ¿ä¼Ò°¡ Á¶°ÇÀ» ¸¸Á·ÇÏ´ÂÁö Á¶»çÇÑ´Ù.

Any

ÇϳªÀÇ ¿ä¼Ò¶óµµ Á¶°ÇÀ» ¸¸Á·ÇÏ´ÂÁö Á¶»çÇÑ´Ù.

Contains

ÁöÁ¤ÇÑ ¿ä¼Ò°¡ Æ÷ÇԵǾî ÀÖ´ÂÁö Á¶»çÇÑ´Ù.

Take

ÁöÁ¤ÇÑ À§Ä¡¿¡¼­ Ä÷º¼ÇÀ» ºÐÇÒÇÑ´Ù.

First

Ä÷º¼ÇÀÇ Ã¹ ¹ø° ¿ä¼Ò¸¦ ±¸ÇÑ´Ù.

Last

Ä÷º¼ÇÀÇ ¸¶Áö¸· ¿ä¼Ò¸¦ ±¸ÇÑ´Ù.

ElementAt

ÁöÁ¤ÇÑ Ã·ÀÚÀÇ ¿ä¼Ò¸¦ ±¸ÇÑ´Ù.

 

LinqArray ¿¹Á¦ÀÇ ar ¹è¿­¿¡¼­ 3ÀÇ ¹è¼ö°¡ ¸î °³³ª µÇ´ÂÁö ¾Ë°í ½Í´Ù¸é °á°ú¼Â¿¡ ´ëÇØ Count ¸Þ¼­µå¸¦ È£ÃâÇÑ´Ù.

 

var Query = from n in ar where (n % 3 == 0) select n;

int count = Query.Count();

Console.WriteLine(count);

 

°á°ú¼ÂÀº ÇÊ¿ä ¾ø°í °³¼ö¸¸ ¾Ë°í ½Í´Ù¸é ´õ °£´ÜÇÏ°Ô Ç¥Çö½Ä ÀÚü¸¦ °ýÈ£·Î ¹­°í Count¸¦ È£ÃâÇÑ´Ù.

 

int count = (from n in ar where (n % 3 == 0) select n).Count();

 

À̰͵µ ±æ´Ù¸é º¯¼ö·Î ´ëÀÔ¹ÞÀ» ÇÊ¿ä ¾øÀÌ CountÀÇ °á°ú¸¦ ¹Ù·Î Ãâ·ÂÇØ ¹ö¸°´Ù.

 

Console.WriteLine((from n in ar where (n % 3 == 0) select n).Count());

 

Á¡Á¡ ´õ ª¾ÆÁö´Âµ¥ ÀÌ·± °Ô Äõ¸®ÀÇ ¹¦¹ÌÀÌ´Ù. ´ÙÀ½ ¿¹Á¦´Â Except ó¸®ÀÚ¸¦ È°¿ëÇÏ¿© µÎ ¸ñ·ÏÀÇ Â÷ÁýÇÕÀ» ±¸ÇÑ´Ù.

 

Except

using System;

using System.Collections.Generic;

using System.Linq;

 

class CSTest {

             static void Main() {

                           var My = new List<string> { "¸Ç¹ßÀÇ ±âºÀÀÌ", "¶Ò¹æÀü¼³", "µð¿ö", "¸¶Æĵµ2", "Ÿ¥" };

                           var Your = new List<string> { "¶Ò¹æÀü¼³", "¿ÕÀÇ ³²ÀÚ", "Áßõ", "µð¿ö", "¶óµð¿À ½ºÅ¸" };

 

                           var Query = (from y in Your select y).Except(from m in My select m);

                           foreach (var s in Query) {

                                        Console.WriteLine(s);

                           }

             }

}

½ÇÇà°á°ú

¿ÕÀÇ ³²ÀÚ

Áßõ

¶óµð¿À ½ºÅ¸

 

My°¡ ³ªÀÇ ¿µÈ­ ¸ñ·ÏÀÌ°í Your°¡ Ä£±¸ÀÇ ¿µÈ­ ¸ñ·ÏÀÌ´Ù. ³»°Ô ¾ø´Â ¿µÈ­¸¦ Á¶»çÇÏ·Á¸é Â÷ÁýÇÕÀ» ±¸ÇØ¾ß Çϴµ¥ ÀÌ·² ¶§ µÎ °³ÀÇ Äõ¸®½ÄÀ¸·Î °¢ÀÚÀÇ ¿µÈ­ ¸ñ·ÏÀ» ±¸ÇÑ ÈÄ Except ¸Þ¼­µå¸¦ È£ÃâÇÑ´Ù. ¸ñ·ÏÀ» ¹Ù²Ù¸é Ä£±¸¿¡°Ô ÁÙ ¿µÈ­ ¸ñ·ÏÀÌ ±¸ÇØÁø´Ù.

 

var Query = (from y in My select y).Except(from m in Your select m);

 

¸ñ·ÏÀÌ Âª¾Æ À°¾ÈÀ¸·Îµµ Â÷ÁýÇÕÀ» ±¸ÇÒ ¼ö ÀÖÁö¸¸ ¼ö õ°³ÀÇ MP3 ÆÄÀÏÀ̰ųª À̸§ÀÌ ¿ä»óÇÏ°Ô ºÙ¿©Áø µ¿¿µ»óÀ̶ó¸é À°¾È °Ë»öÀº ¾î·Æ´Ù. ÀÌ·² ¶§ Äõ¸®¸¦ ½ÇÇàÇϸé Â÷ÁýÇÕÀ» ½±°í Á¤È®ÇÏ°Ô ±¸ÇÒ ¼ö ÀÖ´Ù.

»Ó¸¸ ¾Æ´Ï¶ó ¸ñ·ÏÀ» ¼øȸÇϸ鼭 ÆÄÀÏÀ» ó¸®ÇÏ´Â Äڵ带 ÀÛ¼ºÇÏ¿© Äõ¸® °á°ú¸¦ Áï¼®¿¡¼­ ó¸®ÇÒ ¼ö ÀÖ´Ù. Ä£±¸¸¸ °¡Áö°í ÀÖ´Â ¿µÈ­¸¦ °ñ¶ó º¹»çÇÒ ¼ö ÀÖ°í ¼­·Î ±³È¯µµ °¡´ÉÇÏ´Ù. ¾ð¾î ÅëÇÕÀÇ ÀÌÁ¡À̶ó°í ÇÒ ¼ö ÀÖ´Ù.

15-1-5.Äõ¸®ÀÇ ½ÇÇà

Äõ¸®´Â ´ÜÀÏ°ªÀ» ±¸ÇÏ´Â °£´ÜÇÑ Áú¹®ÀÎ °æ¿ìµµ ÀÖÁö¸¸ ¶§·Î´Â °Å´ëÇÑ µ¥ÀÌÅÍ ÁýÇÕÀ» ¿ä±¸ÇÒ ¼öµµ ÀÖ´Ù. Áú¹® ³»¿ë¿¡ µû¶ó »ó´çÇÑ ½Ã°£ÀÌ °É¸± ¼ö ÀÖ¾î LINQ´Â Äõ¸®¸¦ Áï½Ã ½ÇÇàÇÏÁö ¾Ê°í ´ÙÀ½ 3´Ü°è¸¦ °ÅÃÄ °èȹÀ» § ÈÄ ½ÇÇàÇÑ´Ù.

 

l ¿øÇÏ´Â µ¥ÀÌÅÍ°¡ ÀúÀåµÈ µ¥ÀÌÅÍ ¼Ò½º¸¦ ÁغñÇÑ´Ù. ¹è¿­Àº °£´ÜÇÏÁö¸¸ µ¥ÀÌÅͺ£À̽º³ª XML ¹®¼­´Â º¹ÀâÇÑ °úÁ¤À» ÅëÇØ ¿¬°á ¶Ç´Â ÆĽÌÇØ µÎ¾î¾ß ÇÑ´Ù.

l Áú¹® ³»¿ë¿¡ ÇØ´çÇÏ´Â Äõ¸®¸¦ »ý¼ºÇÑ´Ù. Á¶°Ç¿¡ ¸Â´Â µ¥ÀÌÅ͸¦ °¡Á®¿À´Â ¸í·É¹®À» ÀÛ¼ºÇÏ¿© ½ÇÇàÀ» ÁغñÇÑ´Ù.

l »ý¼ºµÈ Äõ¸®¸¦ ½ÇÇàÇÑ´Ù. foreach ¹®À̳ª ±âŸ À¯»çÇÑ ¹Ýº¹¹®À¸·Î °á°ú¼ÂÀ» ¼øȸÇÏ¸ç µ¥ÀÌÅ͸¦ ²¨³» »ç¿ëÇÑ´Ù.

 

¿©±â¼­ ÇÙ½ÉÀº Äõ¸®¸¦ »ý¼ºÇÏ´Â °Í°ú ½ÇÇàÇÏ´Â °ÍÀº º°°³¶ó´Â °ÍÀÌ´Ù. Äû¸®¸¦ ¸¸µç´Ù°í Çؼ­ °á°ú¼ÂÀÌ °ð¹Ù·Î ±¸ÇØÁö´Â °ÍÀº ¾Æ´Ï´Ù. Áغñ¸¸ ÇØ µÎ¾ú´Ù°¡ °á°ú¼ÂÀ» ÀÐÀ» ¶§ ½ÇÁ¦ µ¥ÀÌÅ͸¦ Àд´Ù. À̸¦ Áö¿¬µÈ ½ÇÇà(Deferred Execution)À̶ó°í ÇÑ´Ù.

 

DeferredExec

using System;

using System.Collections.Generic;

using System.Linq;

 

class CSTest {

             static void Main() {

                           int[] ar = { 1, 2, 3, 4, 5 };

                           var Query = from n in ar select n;

                           foreach (int k in Query) {

                                        Console.Write(k + ",");

                           }

                           Console.WriteLine();

 

                           ar[2] = 9999;

                           foreach (int k in Query) {

                                        Console.Write(k + ",");

                           }

                           Console.WriteLine();

             }

}

½ÇÇà°á°ú

1,2,3,4,5,

1,2,9999,4,5,

 

Á¤¼öÇü ¹è¿­À» ¼±¾ðÇÏ°í Äõ¸®·Î Àоú´Ù. QueryÀÇ ÁúÀÇ ³»¿ëÀº ar ¹è¿­ÀÇ Á¤¼ö nÀ» ¼ø¼­´ë·Î ÀÐ¾î °á°ú¼ÂÀ» ¸¸µå´Â °£´ÜÇÑ °ÍÀÌ´Ù. Äõ¸® º¯¼ö´Â ÇÑ ¹ø¸¸ Á¤ÀÇÇÏ°í ½ÇÇàÀº µÎ ¹ø Ç쵂 Áß°£¿¡ ar[2]¸¦ 9999·Î º¯°æÇÏ¿´´Ù. óÀ½ ¼øȸÇÒ ¶§´Â ¹è¿­¿¡ ÀÖ´Â °ªÀÌ ±×´ë·Î Ãâ·ÂµÈ´Ù. µÎ ¹ø°´Â ¶È°°Àº Query º¯¼ö·Î ¼øȸÇßÁö¸¸ ¼öÁ¤µÈ °ªÀÌ Ãâ·ÂµÈ´Ù. °á°ú¸¦ º¸¸é Äõ¸®¸¦ »ý¼ºÇÏ´Â ½ÃÁ¡ÀÌ ¾Æ´Ñ ¼øȸÇÒ ¶§ °á°ú¼ÂÀ» ¸¸µç´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

Query º¯¼ö¿¡´Â °á°ú¼Â ÀÚü°¡ ¾Æ´Ñ °á°ú¼ÂÀ» ¾ò±â À§ÇÑ Áú¹®¸¸ ÀÖÀ¸¸ç µ¥ÀÌÅÍ ¼Ò½º°¡ ¼öÁ¤µÇ¸é º¯°æµÈ °ªÀÌ ÀÐÇôÁø´Ù. Äõ¸®¸¦ ½ÇÇàÇÒ ¶§¸¶´Ù ´Ù¸¥ °á°ú°¡ ¸®ÅϵǴµ¥ À̸¦ ÇöÀ缺À̶ó°í ÇÑ´Ù. ¼øȸ ½ÃÁ¡ÀÇ °ªÀ» ½Ç½Ã°£À¸·Î Á¶»çÇÏ´Â °ÍÀÌ´Ù. ¿©·¯ ¸íÀÌ µ¿½Ã¿¡ Á¢¼ÓÇϴ ȯ°æ¿¡¼­´Â ÇöÀ缺ÀÌ Áß¿äÇÏ´Ù.

Áö¿¬µÈ ½ÇÇàÀº ¼º´É Çâ»ó¿¡µµ À¯¸®ÇÏ´Ù. °á°ú¼ÂÀÌ 100¸¸°³¶óµµ Äõ¸® »ý¼º ½ÃÁ¡¿¡ ÀÏ°ý Á¶»çÇÒ ÇÊ¿ä ¾ø°í ±×¸¸ÇÑ ¸Þ¸ð¸®¸¦ È®º¸ÇÏ´Â °Íµµ ¾î·Æ´Ù. 100¸¸ °³°¡ µ¿½Ã¿¡ ´Ù ÇÊ¿äÇÑÁö ¾ÕÂÊ ¸î °³¸¸ ÇÊ¿äÇÑÁöµµ Á¤È®È÷ ¾Ë ¼ö ¾ø´Ù. Áö¿¬µÈ ½ÇÇàÀº °æÁ¦ÀûÀÌ°í ¹ÝÀÀ¼ºµµ ÁÁ´Ù. ÀÌ·± ÀÌÀ¯·Î Äõ¸®ÀÇ »ý¼º°ú ½ÇÇàÀ» º°µµ·Î ºÐ¸®ÇÏ¿© ó¸®ÇÑ´Ù. ´Ù¸¸ Count, Sum, Average µî ´ÜÀÏ°ªÀ» ±¸ÇÏ´Â Äõ¸®´Â Áö¿¬½Ãų ÇÊ¿ä ¾ø´Ù. Äõ¸®¸¦ Áï½Ã ½ÇÇàÇÏ°í ½Í´Ù¸é »ý¼º ÈÄ °ð¹Ù·Î ¼øȸÇϸ鼭 º°µµÀÇ Ä÷º¼Ç¿¡ ÀúÀåÇÏ¸é µÈ´Ù.

 

var QuerySrc = from n in ar select n;

List<int> Query = new List<int>();

foreach (int k in QuerySrc) {

         Query.Add(k);

}

 

»çº»À» ¶° µÎ¸é ¿øº»ÀÌ ¾î¶»°Ô ¹Ù²î´õ¶óµµ Äõ¸® »ý¼º ½ÃÁ¡ÀÇ °ªÀ» ÀÐÀ» ¼ö ÀÖ´Ù. Äõ¸®½ÄÀÇ ToList³ª ToArray ¸Þ¼­µå¸¦ È£ÃâÇϸé ÀÌ ÀÛ¾÷À» ´õ ½±°Ô ó¸®ÇÒ ¼ö ÀÖ´Ù. DeferredExec ¿¹Á¦ÀÇ Äõ¸® Á¤Àǹ®À» ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

var Query = (from n in ar select n).ToList();

 

ar ¹è¿­ÀÌ ¾î¶»°Ô ¹Ù²îµç »ó°ü¾øÀÌ »çº»À» ¶ã ¶§ÀÇ °ªÀÌ Ãâ·ÂµÈ´Ù. ToList() ¸Þ¼­µå°¡ »çº»À» ¶ß´Â ¹ø°Å·Î¿î ÀÛ¾÷À» ´ë½ÅÇÑ´Ù.