°´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·ҳ£¬°´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ£¬°´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿£¡
¡ª¡ª¡ª¡ªÎ´ÔĶÁÍꣿ¼ÓÈëÊéÇ©ÒѱãÏ´μÌÐøÔĶÁ£¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡aTicket¡£Numbers£¨2£©¡¡=¡¡numberToSearch¡¡OrElse¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡aTicket¡£Numbers£¨3£©¡¡=¡¡numberToSearch¡¡OrElse¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡aTicket¡£Numbers£¨4£©¡¡=¡¡numberToSearch¡¡OrElse¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡aTicket¡£Numbers£¨5£©¡¡=¡¡numberToSearch¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡runningTotal¡¡£«=¡¡1¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡If¡¡
¡¡¡¡¡¡¡¡Next¡¡
¡¡¡¡¡¡¡¡Return¡¡runningTotal¡¡
End¡¡Function¡¡
¡¡¡¡¡¡¡¡¡¡Notice¡¡the¡¡similarity¡¡of¡¡the¡¡code¡¡to¡¡the¡¡code¡¡presented¡¡in¡¡Chapter¡¡9¡£¡¡The¡¡problem¡¡with¡¡this¡¡¡¡
code¡¡is¡¡that¡¡you¡¡are¡¡iterating¡¡and¡¡solving¡¡a¡¡particular¡¡problem¡£¡¡The¡¡code¡¡cannot¡¡be¡¡easily¡¡adapted¡¡¡¡
to¡¡solving¡¡another¡¡problem¡£¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡reusable¡¡code¡¡is¡¡in¡¡the¡¡form¡¡of¡¡a¡¡LINQ¡¡expression£º¡¡
¡¡¡¡¡¡¡¡Private¡¡Function¡¡FrequencyOfANumber£¨ByVal¡¡numberToSearch¡¡As¡¡Integer£©¡¡As¡¡Integer¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡query¡¡=¡¡From¡¡ticket¡¡In¡¡_tickets¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Where¡¡ticket¡£Numbers£¨0£©¡¡=¡¡numberToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket¡£Numbers£¨1£©¡¡=¡¡numberToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket¡£Numbers£¨2£©¡¡=¡¡numberToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket¡£Numbers£¨3£©¡¡=¡¡numberToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket¡£Numbers£¨4£©¡¡=¡¡numberToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket¡£Numbers£¨5£©¡¡=¡¡numberToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Select¡¡ticket¡£Numbers¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡query¡£Count£¨£©¡¡
¡¡¡¡¡¡¡¡End¡¡Function¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡LINQ¡¡expression¡¡uses¡¡many¡¡constructs¡¡similar¡¡to¡¡a¡¡SQL¡¡SELECT¡¡statement¡£¡¡Here¡¡are¡¡¡¡
the¡¡basic¡¡rules¡¡of¡¡LINQ£º¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡All¡¡LINQ¡¡queries¡¡must¡¡have¡¡a¡¡data¡¡source¡¡£¨From£©¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡All¡¡LINQ¡¡queries¡¡must¡¡have¡¡a¡¡filter¡¡£¨Where£©£»¡¡however£»¡¡if¡¡the¡¡filter¡¡does¡¡not¡¡exist£»¡¡an¡¡auto
¡¡¡¡¡¡¡¡¡¡¡¡¡¡matic¡¡include¡everything¡¡filter¡¡is¡¡implied¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡All¡¡LINQ¡¡queries¡¡must¡¡have¡¡a¡¡resulting¡¡dataset¡¡creator¡¡£¨Select£©¡£¡¡
¡¡¡¡¡¡¡¡¡¡To¡¡execute¡¡a¡¡LINQ¡¡expression£»¡¡you¡¡need¡¡a¡¡data¡¡source¡£¡¡The¡¡data¡¡source¡¡could¡¡be¡¡an¡¡object¡¡¡¡
list£»¡¡an¡¡XML¡¡document£»¡¡or¡¡even¡¡a¡¡relational¡¡database¡¡table¡£¡¡In¡¡the¡¡example£»¡¡the¡¡data¡¡source¡¡is¡¡¡¡
an¡¡object¡¡list¡¡and¡¡is¡¡defined¡¡using¡¡the¡¡From¡¡statement£º¡¡
From¡¡ticket¡¡In¡¡_tickets¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡426¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
404¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡5¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡L¡¡I¡¡N¡¡Q¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Looking¡¡at¡¡the¡¡From¡¡statement£»¡¡you¡¡could¡¡get¡¡the¡¡idea¡¡that¡¡it¡¡is¡¡a¡¡¡¡For¡¡Each¡¡statement¡¡without¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡types¡£¡¡Indeed£»¡¡the¡¡iteration¡¡happens¡¡only¡¡when¡¡you¡¡actually¡¡try¡¡to¡¡use¡¡the¡¡result¡¡of¡¡the¡¡LINQ¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡query¡£¡¡The¡¡From¡¡statement¡¡is¡¡saying¡¡to¡¡iterate¡¡the¡¡data¡¡source¡¡and¡¡assign¡¡each¡¡element¡¡£¨a¡¡Ticket£©¡¡to¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡variable¡¡ticket¡£¡¡Note£»¡¡however£»¡¡that¡¡there¡¡is¡¡no¡¡explicit¡¡type¡¡information£»¡¡which¡¡is¡¡one¡¡of¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡strengths¡¡of¡¡LINQ¡ªyou¡¡have¡¡the¡¡ability¡¡to¡¡easily¡¡slice¡¡and¡¡dice¡¡data¡¡to¡¡suit¡¡your¡¡needs¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡As¡¡you¡¡retrieve¡¡each¡¡item£»¡¡you¡¡want¡¡to¡¡verify¡¡whether¡¡the¡¡item¡¡matches¡¡your¡¡needs¡£¡¡If¡¡you¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡look¡¡at¡¡the¡¡code¡¡that¡¡isn¡¯t¡¡reusable£»¡¡you¡¯ll¡¡see¡¡that¡¡it¡¡checks¡¡this¡¡with¡¡an¡¡If¡¡statement¡£¡¡In¡¡LINQ£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡you¡¡use¡¡the¡¡Where¡¡statement£»¡¡which¡¡is¡¡similar¡¡to¡¡its¡¡SQL¡¡equivalent¡£¡¡With¡¡the¡¡Where¡¡statement£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡you¡¡test¡¡to¡¡see¡¡if¡¡the¡¡item¡¡matches¡¡your¡¡criteria¡£¡¡In¡¡our¡¡case£»¡¡we¡¡check¡¡each¡¡number¡¡in¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Ticket¡¡instance¡¡to¡¡see¡¡if¡¡it¡¡matches¡¡the¡¡number¡¡we¡¯re¡¡currently¡¡seeking¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡If¡¡the¡¡Where¡¡returns¡¡True£»¡¡we¡¡have¡¡a¡¡match¡¡and¡¡we¡¡will¡¡want¡¡to¡¡do¡¡something¡£¡¡In¡¡the¡¡code¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡that¡¡isn¡¯t¡¡reusable£»¡¡that¡¡means¡¡incrementing¡¡the¡¡runningTotal¡¡integer¡£¡¡In¡¡LINQ£»¡¡the¡¡aim¡¡is¡¡to¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡filter¡¡the¡¡data¡¡source¡¡£¨_tickets¡¡in¡¡our¡¡case£©£»¡¡and¡¡thus¡¡the¡¡¡¡Select¡¡statement¡¡is¡¡used¡¡to¡¡create¡¡a¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡new¡¡result¡¡set¡¡of¡¡drawn¡¡numbers¡£¡¡This¡¡result¡¡set¡¡contains¡¡all¡¡of¡¡the¡¡draws¡¡with¡¡the¡¡number¡¡we¡¯re¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡looking¡¡for¡¡£¨numberToSearch£©£»¡¡and¡¡if¡¡the¡¡draws¡¡are¡¡counted£»¡¡we¡¡can¡¡get¡¡the¡¡frequency¡¡of¡¡that¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡number£»¡¡which¡¡we¡¡then¡¡return¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Let¡¯s¡¡look¡¡at¡¡the¡¡LINQ¡¡that¡¡could¡¡be¡¡used¡¡to¡¡find¡¡the¡¡frequency¡¡of¡¡two¡¡numbers¡¡being¡¡drawn¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Function¡¡FrequencyOfTwoNumbers£¨ByVal¡¡number1ToSearch¡¡As¡¡Integer£»¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ByVal¡¡number2ToSearch¡¡As¡¡Integer£©¡¡As¡¡Integer¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡query¡¡=¡¡From¡¡ticket2¡¡In¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£¨From¡¡ticket¡¡In¡¡_tickets¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Where¡¡ticket¡£Numbers£¨0£©¡¡=¡¡number1ToSearch¡¡¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket¡£Numbers£¨1£©¡¡=¡¡number1ToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket¡£Numbers£¨2£©¡¡=¡¡number1ToSearch¡¡¡¡¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket¡£Numbers£¨3£©¡¡=¡¡number1ToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket¡£Numbers£¨4£©¡¡=¡¡number1ToSearch¡¡¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket¡£Numbers£¨5£©¡¡=¡¡number1ToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Select¡¡ticket£©¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Where¡¡ticket2¡£Numbers£¨0£©¡¡=¡¡number2ToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket2¡£Numbers£¨1£©¡¡=¡¡number2ToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket2¡£Numbers£¨2£©¡¡=¡¡number2ToSearch¡¡¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket2¡£Numbers£¨3£©¡¡=¡¡number2ToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket2¡£Numbers£¨4£©¡¡=¡¡number2ToSearch¡¡¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Or¡¡ticket2¡£Numbers£¨5£©¡¡=¡¡number2ToSearch¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Select¡¡ticket2¡£Numbers¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡query¡£Count£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Function¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡LINQ¡¡statement¡¡is¡¡a¡¡concatenation¡¡of¡¡two¡¡LINQ¡¡queries£»¡¡where¡¡one¡¡LINQ¡¡query¡¡is¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡bolded¡£¡¡When¡¡the¡¡query¡¡is¡¡executed£»¡¡the¡¡embedded¡¡query¡¡is¡¡executed¡¡and¡¡generates¡¡a¡¡result¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡set¡£¡¡The¡¡result¡¡set¡¡is¡¡a¡¡data¡¡source¡¡on¡¡which¡¡the¡¡outer¡¡and¡¡second¡¡query¡¡operates£»¡¡which¡¡then¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡generates¡¡another¡¡result¡¡set¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡You¡¡do¡¡not¡¡need¡¡to¡¡embed¡¡LINQ¡¡queries¡¡as¡¡in¡¡the¡¡preceding¡¡code¡£¡¡You¡¡could¡¡write¡¡functions¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡and¡¡embed¡¡the¡¡result¡¡of¡¡a¡¡LINQ¡¡query¡¡as¡¡the¡¡data¡¡source¡¡of¡¡another¡¡LINQ¡¡query¡£¡¡The¡¡power¡¡of¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡LINQ¡¡is¡¡that¡¡you¡¡can£»¡¡in¡¡theory£»¡¡arbitrarily¡¡embed¡¡many¡¡queries¡¡within¡¡other¡¡queries£»¡¡since¡¡you¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡are¡¡creating¡¡a¡¡filtering¡¡mechanism¡¡where¡¡one¡¡result¡¡set¡¡is¡¡the¡¡data¡¡source¡¡of¡¡another¡¡query¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡427¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡