°­ÁÂ¿Í ÆÁ

C# Aggregate È®Àå ¸Þ¼­µå ³¯Â¥:2020-3-16 3:24:48 Á¶È¸¼ö:192
ÀÛ¼ºÀÚ : ¼Ò¿£
Æ÷ÀÎÆ® : 1459
°¡ÀÔÀÏ : 2020-02-02 00:09:14
¹æ¹®È½¼ö : 89
±Û 192°³, ´ñ±Û 57°³
¼Ò°³ : SoEn ¿î¿µÀÚÀÔ´Ï´Ù.
ÀÛ¼º±Û º¸±â
ÂÊÁö º¸³»±â
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

¸ñ·Ïº¸±â »èÁ¦ ¼öÁ¤ ½Å°í ½ºÅ©·¦


·Î±×ÀÎÇÏ¼Å¾ß ´ñ±ÛÀ» ´Þ ¼ö ÀÖ½À´Ï´Ù.