C#ÀÇ System.Linq ³×ÀÓ½ºÆäÀ̽º¿¡ Ä÷º¼ÇÀ» Á¦¾îÇÏ´Â ¿©·¯ °¡Áö È®Àå ÇÔ¼ö°¡ Æ÷ÇԵǾî ÀÖ´Ù. Sum, Max, First, Count °°Àº°Ç À̸§¸¸ ºÁµµ ¹¹Çϴ°ÇÁö ½±°Ô ¾Ë ¼ö ÀÖ°í »ç¿ë ¹æ¹ýµµ Á÷°üÀûÀÌ´Ù. ±× Áß¿¡ ³À̵µ°¡ ³ôÀº°Ô AggregateÀÌ´Ù. ÀÌ ¸Þ¼µå¸¦ ÅëÇØ È®Àå ÇÔ¼ö¿Í ¶÷´Ù½ÄÀ» Ȱ¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¿¬±¸ÇØ º¸ÀÚ. ´ÙÀ½ 3 °³ÀÇ ¿øÇüÀÌ ÀÖ´Ù.
Aggregate<TSource,TAccumulate,TResult>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate,TSource,TAccumulate>, Func<TAccumulate,TResult>)
Aggregate<TSource,TAccumulate>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate,TSource,TAccumulate>)
Aggregate<TSource>(IEnumerable<TSource>, Func<TSource,TSource,TSource>)
ÃʱⰪÀ» ¹Þ´Â ¹öÀüÀÌ ÀÖ°í °á°ú°ªÀ» ¼±ÅÃÇÏ´Â ÇÔ¼ö¸¦ Á¦°øÇÏ´Â ¹öÀüÀÌ ÀÖ´Ù. °¡Àå °£´ÜÇÑ ¼¼¹øÂ° ¿øÇüÀ» »ç¿ëÇØ º¸ÀÚ. ù¹øÂ° Àμö´Â IEnumerable<TSource>À̸ç TSource ŸÀÔÀ» ÀúÀåÇÏ´Â ÀÓÀÇÀÇ Ä÷º¼ÇÀÌ´Ù. È®Àå ÇÔ¼öÀÌ´Ï ½ÇÁ¦ Àμö·Î Àü´ÞÇÒ ÇÊ¿ä ¾øÀÌ Ä÷º¼Ç.Aggregate() Çü½ÄÀ¸·Î È£ÃâÇÑ´Ù. ¹è¿À̳ª List °°Àº ¿°Å °¡´ÉÇÑ ¸ðµç ŸÀÔ¿¡ ´ëÇØ ´Ù ¾µ ¼ö ÀÖ´Ù´Â ¾ê±â´Ù.
µÎ¹øÂ° Àμö´Â TSource ŸÀÔÀÇ Àμö µÑÀ» ¹Þ¾Æ TSource ŸÀÔÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö FuncÀÌ´Ù. ÀÌ ÇÔ¼ö´Â Ä÷º¼ÇÀÇ ¿ä¼Ò¸¦ ¼ø¼´ë·Î Àü´ÞÇÏ¿© µÎ °ªÀ» ¿¬»êÇÑ °á°ú Çϳª¸¦ ¸®ÅÏÇÑ´Ù. ¿ä¼Ò¿¡ ´ëÇØ ÀÓÀÇÀÇ µ¿ÀÛÀÌ °¡´ÉÇϹǷΠ¼øÈ¸°¡ ÇÊ¿äÇÑ °ÅÀÇ ¸ðµç ¿¬»êÀ» ´Ù ó¸®ÇÒ ¼ö ÀÖ´Ù. ù ¹øÂ° Ȱ¿ë ¿¹Á¦¸¦ º¸ÀÚ.
using System;
using System.Collections.Generic;
using System.Linq;
class CSTest {
static int value = 48;
static void Main() {
int[] pos = { 15, 90, 34, 82, 52, 43, 69, 27, 75, 79 };
int nearest = pos.Aggregate((last, next) => Math.Abs(value - last) < Math.Abs(value - next) ? last : next);
Console.WriteLine("±ÙÁ¢°ª = " + nearest);
}
}
Á¤¼öÇü ¹è¿ pos¿¡¼ value¿Í °¡Àå ±ÙÁ¢ÇÑ °ªÀ» ã´Â ¿¹Á¦ÀÌ´Ù. À°¾ÈÀ¸·Î ´ëÃæ °Ë»öÇØ ºÁµµ 52¶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖÀ¸¸ç °á°ú°ªÀº ¹°·Ð 52·Î Ãâ·ÂµÈ´Ù.
AggregateÀÇ Àμö·Î ¶÷´Ù ÇÔ¼ö¸¦ Àü´ÞÇß´Ù. ÀÌ ÇÔ¼ö´Â last¿Í next µÎ °³ÀÇ Àμö¸¦ Àü´Þ¹Þ¾Æ Â÷ÀÇ Àý´ë°ªÀ» ºñ±³ÇÏ¿© µÑ Áß ¾î¶² °ªÀÌ value¿¡ °¡±î¿îÁö °á°ú¸¦ ¸®ÅÏÇÑ´Ù. Aggregate ¸Þ¼µå´Â posÀÇ Ã¹ ¿ä¼Ò¿Í µÎ ¹øÂ° ¿ä¼Ò¸¦ ¶÷´Ù ÇÔ¼ö·Î Àü´ÞÇÏ°í ºñ±³ °á°ú¸¦ last¿¡ ´ëÀÔÇÏ¿© ´Ù½Ã ´ÙÀ½ ¿ä¼Ò¿Í ÇÔ²² Àü´ÞÇϱ⸦ ¸ðµç ¿ä¼Ò¿¡ ´ëÇØ ¹Ýº¹ÇÑ´Ù. ½ÇÇà ¼ø¼´Â ´ÙÀ½°ú °°´Ù.
¶÷´Ù(15, 90) => 15 ¸®ÅÏ
¶÷´Ù(15, 34) => 34 ¸®ÅÏ
¶÷´Ù(34, 82) => 34 ¸®ÅÏ
¶÷´Ù(34, 52) => 52 ¸®ÅÏ
¶÷´Ù(52, 43) => 52 ¸®ÅÏ
....
ÀÌ °úÁ¤À» Ä÷º¼Ç ³¡±îÁö ¹Ýº¹ÇÏ¿© ÃÖÁ¾°ª 52¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ º¹ÀâÇÑ µ¿ÀÛÀ» Aggregate ¸Þ¼µå È£Ãâ¹® Çϳª·Î ó¸®ÇÒ ¼ö ÀÖ´Â ÀÌÀ¯´Â Àμö·Î ¶÷´Ù½ÄÀ» Àü´ÞÇÏ¿© ³»ºÎ¿¡¼ ¿øÇÏ´Â ¿¬»êÀ» ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù.
Àͼ÷ÇØÁö¸é ÀÌ·± ½ÄÀ» ±Ý¹æ ÀÛ¼ºÇÒ ¼ö ÀÖÁö¸¸ óÀ½ º¸´Â »ç¶÷Àº µµ´ëü ÀÌ°Ô ¹º ÄÚµåÀÎÁö Çò°¥¸± ¼ö¹Û¿¡ ¾ø´Ù. ±×·¡¼ Á» ´õ ½±°Ô Ç®¾î º¸¾Ò´Ù.
class CSTest {
static int value = 48;
static void Main()
{
int[] pos = { 15, 90, 34, 82, 52, 43, 69, 27, 75, 79 };
int nearest = pos.Aggregate(findNear);
Console.WriteLine("±ÙÁ¢°ª = " + nearest);
}
static int findNear(int last, int next)
{
return Math.Abs(value - last) < Math.Abs(value - next) ? last : next;
}
}
¶÷´Ù½ÄÀ» findNear¶ó´Â ÇÔ¼ö·Î µû·Î ¼±¾ðÇϰí ÀÌ ÇÔ¼ö¸¦ AggreagteÀμö·Î Àü´ÞÇß´Ù. findNear°¡ ¿øÇüÀÇ Func<TSource,TSource,TSource>¿¡ ÇØ´çÇÑ´Ù. ¿©±â¼ TSource´Â intÀ̸ç findNear´Â int Àμö last¿Í next¸¦ ¹Þ¾Æ ´Ù½Ã int¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼öÀÌ´Ù. º»Ã¼¿¡¼´Â last¿Í next Áß ´©°¡ value¿Í °¡±î¿îÁö ºñ±³ÇÏ¿© °¡±î¿î °ªÀ» ¸®ÅÏÇÑ´Ù.
ù ¿¹Á¦¸¦ Ç®¾î ¾´ °ÍÀ̹ǷΠ½ÇÇà °á°ú´Â °°´Ù. ±×·¸´Ù¸é Aggregate ¸Þ¼µå´Â ¾î¶»°Ô ÀÛ¼ºµÇ¾î ÀÖÀ»±î? ÀÌ ÇÔ¼ö ³»ºÎµµ Ç®¾î ½á º¸ÀÚ. ¼Ò½º±îÁö º¼ Çʿ䵵 ¾øÀÌ ³»ºÎ µ¿ÀÛÀ» ½±°Ô À¯ÃßÇÒ ¼ö ÀÖ´Ù.
class CSTest {
static int value = 48;
static void Main()
{
int[] pos = { 15, 90, 34, 82, 52, 43, 69, 27, 75, 79 };
int last = pos[0];
for (int i = 1;i < pos.Length;i++)
{
last = findNear(last, pos[i]);
}
int nearest = last;
Console.WriteLine("±ÙÁ¢°ª = " + nearest);
}
static int findNear(int last, int next)
{
return Math.Abs(value - last) < Math.Abs(value - next) ? last : next;
}
}
last¿¡ ù ¿ä¼Ò¸¦ ´ëÀÔÇϰí 1¹øÂ° ¿ä¼ÒºÎÅÍ ³¡±îÁö last¿Í ÇÔ²² findNear ÇÔ¼ö·Î Àü´ÞÇÑ´Ù. ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â ±ÙÁ¢°ªÀÌ ´Ù½Ã last¿¡ ´ëÀÔµÇ¾î ´ÙÀ½ ¿ä¼Ò¿Í ºñ±³Çϱ⸦ Ä÷º¼Ç ³¡±îÁö ¹Ýº¹ÇÏ´Â °ÍÀÌ´Ù. ÆòÀÌÇÏ°Ô Ç®¾î ½èÀ¸´Ï ÀÌÇØÇϱâ´Â ¾î·ÆÁö ¾Ê´Ù. À̰ÍÀ» ÇÑÁÙ·Î ¾ÐÃàÇϸé ù¹øÂ° ¿¹Á¦°¡ µÈ´Ù.
È®Àå ÇÔ¼ö¿Í ¶÷´Ù½ÄÀÌ µé¾î°¡ º¹ÀâÇØ º¸ÀÏ »Ó ¾²±â¿¡´Â ¿ÀÈ÷·Á ´õ °£ÆíÇÏ´Ù. ¾ÐÃàÀûÀÎ Äڵ尡 Àß ÀÌÇØµÇÁö ¾ÊÀ¸¸é ÀÌ·± ½ÄÀ¸·Î Ç®¾î¼ »ý°¢ÇØ º¸¸é µÈ´Ù. ±»ÀÌ ÄÚµå·Î Â¥ º¼ ÇÊ¿ä ¾øÀÌ ¸Ó¸®¼Ó¿¡¼ ¹Ù·Î ÇØÃ¼ °¡´ÉÇØ¾ß ¶÷´Ù½ÄÀ» ÀÚÀ¯ ÀÚÀç·Î ¾µ ¼ö ÀÖ´Ù.
Ç®¾î¾´ °Í¿¡ ºñÇØ Á» º¹ÀâÇØ º¸¿©¼ ±×·¸Áö ÄÚµå´Â È®½ÇÈ÷ ª´Ù. ±×·¸´Ù¸é ¶÷´Ù½ÄÀ» ¾´ °Í°ú ÆòÀÌÇÏ°Ô Ç®¾î¾´ °ÍÀÇ ¼ÓµµÂ÷´Â ¾î¶³±î Å×½ºÆ®ÇØ º¸ÀÚ. õ¸¸°³ÀÇ ³¼ö ¹è¿À» »ý¼ºÇϰí ÀÌ ¹è¿À» °Ë»öÇÑ´Ù.
class CSTest {
static int value = 48;
static void Main()
{
List<int> pos = new List<int>();
Random r = new Random();
for (int i = 0; i < 10000000; i++)
{
pos.Add(r.Next(1, 100));
}
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int last = pos[0];
for (int i = 1; i < pos.Count; i++)
{
last = findNear(last, pos[i]);
}
int nearest = last;
sw.Stop();
Console.WriteLine("½Ã°£ = " + sw.Elapsed);
sw.Reset();
sw.Start();
nearest = pos.Aggregate((last, next) => Math.Abs(value - last) < Math.Abs(value - next) ? last : next);
sw.Stop();
Console.WriteLine("½Ã°£ = " + sw.Elapsed);
}
static int findNear(int last, int next)
{
return Math.Abs(value - last) < Math.Abs(value - next) ? last : next;
}
}
C#¿¡¼ ½Ã°£ ÃøÁ¤Àº Stopwatch·Î ÇÑ´Ù. °¢ ¹æ½ÄÀ¸·Î °Ë»öÇØ º¸°í ¼Ò¿ä ½Ã°£À» ÃøÁ¤ÇÏ¿© Ãâ·ÂÇß´Ù.
½Ã°£ = 00:00:00.1356860
½Ã°£ = 00:00:00.1249265
º¸´Ù½ÃÇÇ ´ëµ¿¼ÒÀÌÇÏ´Ù. õ¸¸¹ø ¼øÂ÷ °Ë»öÀ» 0.1Ãʸ¸¿¡ ÇØ Ä¡¿ì´Ï ÀÌ Á¤µµ¸é ÁؼöÇÏ´Ù. ¶÷´Ù½ÄÀ» »ç¿ëÇÏ´Â °ÍÀÌ ±Ù¼ÒÇÏ°Ô ¾à°£ ´õ ºü¸£Áö¸¸ À¯ÀǹÌÇÑ Â÷ÀÌ´Â ¾Æ´Ï´Ù. È®Àå ÇÔ¼öµµ ¾îÂ÷ÇÇ C# ÄÚµå·Î ÀÛ¼ºµÇ¾î ÀÖÀ¸´Ï º°¹Ý Â÷À̳¯ ¸®°¡ ¾ø´Ù. ´Ù¸¸ 10ÁÙ Äڵ带 ´Ü ÇÑÁÙ·Î ¾µ ¼ö ÀÖ¾î Æí¸®ÇÏ´Ù.
ÀÌ °Á¸¦ ÅëÇØ ¶÷´Ù½Äµµ º°°Å ¾Æ´Ï¶ó´Â °ÍÀ» ¾Ë¾ÒÀ¸¸é ÁÁ°Ú´Ù. µü Çѹø¸¸ ¾µ ÇÔ¼ö¸¦ À̸§Àº »©°í °£·«ÇÏ°Ô Á¤ÀÇÇÑ °Í »ÓÀÌ´Ù. ´å³Ý ÇÁ·¹ÀÓ¿öÅ©¿¡´Â Àß ¸¸µé¾î ³õÀº È®Àå ÇÔ¼ö°¡ ¸¹À¸´Ï ½Ã°£³¯ ¶§¸¶´Ù Æ´Æ´ÀÌ Ã£¾Æ¼ ¿¬±¸ÇØ º¸ÀÚ. Àͼ÷ÇØÁö¸é ½Ã°£À» ¸¹ÀÌ Àý¾àÇÒ ¼ö ÀÖ°í ÀÌ¹Ì °ËÁõµÈ ÄÚµå·Î »ý»ê¼ºÀ» Çâ»ó½Ãų ¼ö ÀÖ´Ù.

°³¹ßÀÚÀÇ Ãµ±¹ SoEn |
|