Introducing to Microsoft LINQ (In Uyghur)

Reviews
Shared by: Hoshur Merdan
Stats
views:
194
rating:
not rated
reviews:
0
posted:
2/12/2009
language:
English
pages:
0
www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 1 ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫2‬ ‫ﻣﯘﻧﺪﻩﺭﯨﺠﻪ‬ ‫ﺋﺎﺗﺎﻟﻐﯘﻻﺭ ﺋﯩﺰﺍﮬﺎﺗﻰ ................................................................................ 5‬ ‫ﺋﯩﻜﻜﯩﻨﭽﻰ ﺑﺎﺏ #‪ C‬ﺗﯩﻠﯩﻨﯩﯔ ﺧﯘﺳﯘﺳﯩﻴﻪﺗﻠﯩﺮﻯ ...................................................... 01‬ ‫0.2 #‪ C‬ﮔﻪ ﻗﺎﻳﺘﺎ ﻧﻪﺯﻩﺭ ......................................................................... 01‬ ‫ﻛﯚﭘﻤﺎﺳﻠﯩﻖ ..................................................................................... 01‬ ‫ﻣﯘﯞﻩﻗﻘﻪﺗﻠﻪﺭ .................................................................................... 31‬ ‫ﻧﺎﻣﺴﯩﺰ ﻣﯧﺘﻮﺩ ................................................................................... 51‬ ‫‪ Enumerators‬ﯞﻩ ‪17 ....................................................................... Yield‬‬ ‫0.3 #‪ C‬ﻧﯩﯔ ﺧﯘﺳﯘﺳﯩﻴﻪﺗﻠﯩﺮﻯ................................................................... 22‬ ‫‪ var‬ﺧﺎﺱ ﺳﯚﺯﻯ ................................................................................ 22‬ ‫ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪ ﻣﯧﺘﻮﺩ ............................................................................... 32‬ ‫ﺋﻮﺑﻴﯧﻜﺘﻼﺭﻧﻰ ﺩﻩﺳﻠﻪﭘﻠﻪﺷﺘﯜﺭﯛﺵ ﺋﯩﭙﺎﺩﯨﺴﻰ ........................................................ 82‬ ‫ﻧﺎﻣﺴﯩﺰ ﺗﯩﭗ .................................................................................... 13‬ ‫‪ Query‬ﺋﯩﭙﺎﺩﯨﺴﻰ )ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ( ....................................................... 33‬ ‫‪ Linq‬ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩﺴﯩﺪﯨﻦ ﺋﺎﺳﺎﺱ .................................................. 53‬ ‫ﺗﯚﺗﯩﻨﭽﻰ ﺑﺎﺏ‬ ‫‪ LINQ‬ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﻠﯩﺮﻯ )‪35 ...................................................... (LINQ Queries‬‬ ‫ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩﺴﻰ ...................................................................... 53‬ ‫ﺗﻮﻟﯘﻕ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ................................................................... 83‬ ‫ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ.................................................................... 04‬ ‫‪ Where‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ .......................................................................... 04‬ ‫ﺋﻪﻣﻪﻟﯩﻠﻪﺷﺘﯜﺭﯛﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )‪42 ....................................... (Projection Operators‬‬ ‫‪ SelectMany‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ..................................................................... 34‬ ‫‪ Ordering‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﺳﻮﺭﺗﻼﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ( ........................................... 54‬ ‫‪ OrderBy‬ﺑﯩﻠﻪﻥ ‪ OrderByDescending‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ............................................ 54‬ ‫‪ ThenBy‬ﺑﯩﻠﻪﻥ ‪ ThenByDescending‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ............................................. 64‬ ‫‪ Reverce‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ )ﻛﯚﻣﺘﯜﺭﯛﺵ( ............................................................ 84‬ ‫‪ Grouping‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﮔﯘﺭﯗﭘﭙﯩﻼﺵ( ....................................................... 84‬ ‫‪ Join‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﮬﻪﻣﺪﻩﻡ( ................................................................. 15‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫3‬ ‫‪) Join‬ﮬﻪﻣﺪﻩﻡ ( ................................................................................ 15‬ ‫‪ GroupJoin‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ...................................................................... 35‬ ‫‪ Set‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﺗﻮﭘﻼﻡ(.................................................................... 55‬ ‫‪ Distinct‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ )ﺗﻪﻛﺮﺍﺭﻧﻰ ﺗﺎﺯﯨﻼﺵ( ..................................................... 55‬ ‫‪56 ................................................................ Union, Intersect, and Except‬‬ ‫‪ Aggregate‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﺟﻪﻣﻠﻪﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ( .......................................... 95‬ ‫‪ Count‬ﯞﻩ ‪ LongCount‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ........................................................... 95‬ ‫‪ Sum‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ )ﻳﯩﻐﯩﻨﺪﺍ(................................................................... 06‬ ‫‪63 .................................................................................Min and Max‬‬ ‫‪ Average‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ........................................................................ 56‬ ‫‪ Generation‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﻗﯘﺭﻏﯘﭺ( .......................................................... 76‬ ‫‪) Range‬ﺩﺍﺋﯩﺮﻩ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ( .................................................................. 76‬ ‫‪) Repeat‬ﺗﻪﻛﺮﺍﺭ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ( ................................................................. 86‬ ‫‪) Empty‬ﻗﯘﺭﯗﻕ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ( ................................................................. 96‬ ‫‪ Quantifiers‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﻣﯩﻘﺪﺍﺭ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ(............................................ 96‬ ‫‪ Any‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ............................................................................ 96‬ ‫‪) All‬ﮬﻪﻣﻤﻪ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ( ..................................................................... 07‬ ‫‪) Contains‬ﺑﺎﺭﻣﯘ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ( ................................................................ 07‬ ‫‪ Partitioning‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﭘﺎﺭﭼﯩﻼﺵ( ....................................................... 17‬ ‫‪) Take‬ﻧﻰ- ﺋﯧﻠﯩﺶ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ(.............................................................. 27‬ ‫‪) TakeWhile‬ﭼﺎﻏﺪﺍ- ﺋﯧﻠﯩﺶ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ( ..................................................... 37‬ ‫‪ Skip‬ﺑﯩﻠﻪﻥ ‪74 ........................................................................ SkipWhile‬‬ ‫ﺋﯧﻠﯧﻤﯧﻨﺖ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ....................................................................... 57‬ ‫‪) First‬ﺗﯘﻧﺠﻰ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ( ................................................................... 57‬ ‫‪75 ................................................................................ FirstOrDefault‬‬ ‫‪ Last‬ﺑﯩﻠﻪﻥ ‪76 .................................................................... LastOrDefault‬‬ ‫‪76 ........................................................................................ Single‬‬ ‫‪77 .............................................................................. SingleOrDefault‬‬ ‫‪ ElementAt‬ﺑﯩﻠﻪﻥ ‪77 ....................................................... ElementAtOrDefault‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫4‬ ‫‪78 ............................................................................... DefaultIfEmpty‬‬ ‫ﺑﺎﺷﻘﺎ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻼﺭ ............................................................................. 08‬ ‫‪) Concat‬ﺋﯘﻻﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ( ................................................................. 08‬ ‫‪81 ............................................................................... SequenceEqual‬‬ ‫ﻛﯧﭽﯩﻜﺘﯜﺭﯛﻟﻤﻪ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﻨﯩﯔ ﻗﯩﻤﻤﻪﺗﻠﯩﻨﯩﺸﻰ ﯞﻩ ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪ ﻣﯧﺘﻮﺩ ﭼﺎﺭﯨﺴﻰ ......................... 28‬ ‫ﻛﯧﭽﯩﻜﺘﯜﺭﯛﻟﻤﻪ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﻨﯩﯔ ﻗﯩﻤﻤﻪﺗﻠﯩﻨﯩﺸﻰ ..................................................... 28‬ ‫ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪ ﻣﯧﺘﻮﺩ ﭼﺎﺭﯨﺴﻰ ....................................................................... 48‬ ‫ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ................................................................... 58‬ ‫‪ ToArray‬ﺑﯩﻠﻪﻥ ‪86 ........................................................................ ToList‬‬ ‫‪88 ................................................................................. ToDictionary‬‬ ‫‪89 .................................................................................... ToLookup‬‬ ‫‪ OfType‬ﺑﯩﻠﻪﻥ ‪91 ........................................................................... Cast‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫5‬ ‫ﺋﺎﺗﺎﻟﻐﯘﻻﺭ ﺋﯩﺰﺍﮬﺎﺗﻰ‬ ‫ﻣﻪﺯﻛــﯘﺭ ﻛﯩﺘــﺎﺑﻨﻰ ﺋﻮﻗــﯘﺵ ﺟﻪﺭﻳﺎﻧﯩــﺪﺍ ﭘــﺎﺕ-ﭘــﺎﺕ ﻛﯜﻟــﯜﭖ ﺗﯘﺭﯨــﺪﯨﻐﺎﻧﻠﯩﻘﯩﯖﯩﺰﻏﺎ ﺋﯩــﺸﻪﻧﭽﯩﻢ ﻛﺎﻣﯩــﻞ.‬ ‫ﺋﻪﺳـــﻠﯩﺪﻩ ﺋﺎﺗـــﺎﻟﻐﯘﻻﺭ ﺋﯩﺰﺍﮬـــﺎﺗﻰ ﻣﻪﻥ ﻳﺎﺯﯨـــﺪﯨﻐﺎﻥ ﻣﻪﺯﻣـــﯘﻥ ﺋﻪﻣﻪﺱ ﺋﯩـــﺪﻯ، ﻟـــﯧﻜﯩﻦ ﻛﻮﻣﭙﯩﻴـــﯘﺗﯧﺮ‬ ‫ﺳﺎﮬﻪﺳــﯩﺪﯨﻜﻰ ﻛﻪﺳــﭙﯩﻲ ﺋﺎﺗــﺎﻟﻐﯘﻻﺭﻧﻰ ﺋﺎﺗــﺎﻟﻐﯘ ﺋﯩﺰﺍﮬــﺎﺕ ﻟــﯘﻏﻪﺗﻠﯩﺮﯨﻤﯩﺰﺩﯨﻦ ﺗﻮﻟــﯘﻕ ﺗﺎﭘﺎﻻﻳــﺪﯨﻐﺎﻥ‬ ‫ﺑﻮﻟﯘﺷـــﯩﻤﯩﺰﻏﺎ ﻳﻪﻧﻪ ﺑﯩـــﺮ ﻣﻪﺯﮔﯩـــﻞ ﻛﯧﺘﯩـــﺪﯨﻐﺎﻥ ﺑﻮﻟﻐﺎﭼﻘـــﺎ، ﺑﯩـــﺮ ﻗﯩـــﺴﯩﻢ ﻛﻪﺳـــﭙﻰ ﺋﺎﺗـــﺎﻟﻐﯘﻻﺭﻧﻰ‬ ‫ﺟﯚﻳﻠﯜﺷ ـﯩﻤﯩﺰﮔﻪ ﺗ ـﻮﻏﺮﺍ ﻛﻪﻟ ـﺪﻯ. ﺷ ـﯘﯕﺎ ﻛﯩﺘ ـﺎﺏ ﻣﻪﺯﻣﯘﻧﯩ ـﺪﺍ ﺗﯚﯞﻩﻧ ـﺪﯨﻜﻰ ﺳ ـﯚﺯﻟﻪﺭﻧﻰ ﺋ ـﯘﭼﺮﺍﺗﻘﯩﻨﯩﯖﯩﺰﺩﺍ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻛــﯜﻟﮕﻪﭺ ﺗــﻮﻏﺮﺍ ﭼﯜﺷﯩﻨﻪﺭﺳــﯩﺰ. ﺋﺎﺗــﺎﻟﻐﯘ ﺗﻪﺭﺟﯩــﻤﻪ ﺧﯩﺰﻣﯩﺘﯩــﺪﻩ ﻗﯩﻤﻤﻪﺗﻠﯩــﻚ ﭘﯩﻜﯩﺮﻟﻪﺭﻧــﻰ ﺑﻪﺭﮔﻪﻥ‬ ‫ﺋﯚﻣﻪﺭﺟﺎﻥ ﺋﺎﺑﺪﯗﺭﺍﺧﻤﺎﻥ )ﺋﯘﭼﻘﯘﻥ( ﺋﻪﭘﻪﻧﺪﯨﮕﻪ ﻛﯚﭖ ﺗﻪﺷﻪﻛﻜﯜﺭ.‬ ‫ﻛﯚﭘﻤﺎﺱ \ ﻛﯚﭘﻤﺎﺳﻠﯩﻖ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩﺴﻰ: ‪ ،generic‬ﺧﻪﻧﺰﯗﭼﯩﺴﻰ: ‪ 泛型‬ﺑﻮﻟـﯘﭖ، ﺋﻮﺭﺗـﺎﻕ ﺗﯩﭙﻠﯩـﻖ،‬ ‫ﮬﻪﻣﻤﯩ ـﮕﻪ ﻣ ـﺎﺱ ﻛﯧﻠﯩ ـﺪﯨﻐﺎﻥ ﺩﯦ ـﮕﻪﻥ ﻣﻪﻧﯩﻠﻪﺭﻧ ـﻰ ﺑﯧﺮﯨ ـﺪﯗ. ﭘﺮﻭﮔﺮﺍﻣﻤ ـﺎ ﻧﯘﻗﺘﯩ ـﺴﯩﺪﯨﻦ ﭼﯜﺷ ـﻪﻧﮕﻪﻧﺪﻩ،‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫‪ generic‬ﺗﯩ ـﭗ ﺑﻮﻟــﺴﺎ ﻛﻮﻧﻜﺮﯦــﺖ ﺑﯩــﺮ ﺗﯩﭙﻨــﻰ ﻛﯚﺭﺳــﻪﺗﻤﻪﻱ ﺑﻪﻟﻜــﻰ ﺗﯩﭙــﻰ ﻣﻪﺷــﻐﯘﻻﺗﻘﺎ ﻗﺎﺗﻨﺎﺷــﻘﯘﭼﻰ‬ ‫ـ‬ ‫ﻛﻮﻧﻜﺮﯦﺖ ﺗﯩﭗ ﺗﻪﺭﯨﭙﯩﺪﯨﻦ ﺑﻪﻟﮕﯩﻠﯩﻨﯩﺪﯨﻐﺎﻥ ﺋﯧﻨﯩﻘﺴﯩﺰ، ﮬﻪﻣﻤﯩﮕﻪ ﻣـﺎﺱ ﻛﯧﻠﯩـﺪﯨﻐﺎﻥ ﺗﯩـﭗ ﺑﻮﻟﻐﺎﭼﻘـﺎ،‬ ‫ﺋﯘﻧﯩﯔ ﮬﻪﻣﻤﯩﮕﻪ ﻣـﺎﺱ ﻛﯧﻠﯩـﺪﯨﻐﺎﻥ ﺋﺎﻻﮬﯩـﺪﯨﻠﯩﻜﯩﻨﻰ ﮔﻪﯞﺩﯨﻠﻪﻧـﺪﯛﺭﯛﺵ ﻳﯜﺯﯨـﺴﯩﺪﯨﻦ ﺋﯘﻧﯩـﯔ ﺳـﯜﭘﻪﺕ‬ ‫ﺷﻪﻛﻠﻰ »ﻛﯚﭘﻤﺎﺱ«، ﺋﯩﺴﯩﻢ ﺷﻪﻛﻠﻰ »ﻛﯚﭘﻤﺎﺳﻠﯩﻖ« ﺩﻩﭖ ﺋﯧﻠﯩﻨﺪﻯ.‬ ‫ـ‬ ‫ـ‬ ‫ﻛ ـﻮﺩ ﻗ ـﺎﭘﭽﯘﻗﻰ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩ ـﺴﻰ: ‪ ،Code Container‬ﺧﻪﻧﺰﯗﭼﯩ ـﺴﻰ: ‪ 代码容器‬ﺑﻮﻟ ـﯘﭖ، ﻣﻪﻟ ـﯘﻡ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻛــﻮﺩﻻﺭﻧﻰ ﺋﯚﺯﯨــﺪﻩ ﺋﯧﻠﯩــﭗ ﻳﯜﺭﻩﻟﻪﻳــﺪﯨﻐﺎﻥ ﻛــﻮﺩ ﺑــﯚﻟﯩﻜﯩﻨﻰ ﻛﯚﺭﺳــﯩﺘﯩﺪﯗ. ‪ Container‬ﻳﻪﻧــﻰ ‪容器‬‬ ‫ﭘﺮﻭﮔﺮﺍﻣﻤﺎ ﺳﺎﮬﻪﺳﯩﺪﻩ ﻛﯚﭖ ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺪﯨﻐﺎﻥ ﺋﺎﺗﺎﻟﻐﯘ ﺑﻮﻟﯘﭖ، ﺑﯩﺮ ﺗﯜﺭﻛﯜﻡ ﻧﻪﺭﺳﯩﻠﻪﺭﻧﻰ ﺋﯚﺯﯨﺪﻩ ﺗﯘﺗـﯘﭖ‬ ‫ﺗﯘﺭﺍﻻﻳﺪﯨﻐﺎﻥ ﺋﻮﺑﻴﯧﻜﺘﻼﺭﻧﻰ ﻛﯚﭘﺮﻩﻙ ﻣﯘﺷﯘ ﺳـﯚﺯ ﺑﯩـﻠﻪﻥ ﺋﺎﺗﺎﻳـﺪﯗ. ﻣﻪﺳـﯩﻠﻪﻥ، ‪Control Container‬‬ ‫)ﻛﻮﻧﺘﺮﻭﻝ ﻗﺎﭘﭽﯘﻗﻰ( ﺩﯦﮕﻪﻧﺪﻩﻙ. ﺑﯘ ﺧﯩﻞ ﺋﺎﻻﮬﯩـﺪﯨﻠﯩﻜﻨﻰ ﺋﯩﭙـﺎﺩﯨﻠﻪﺵ ﺋﯜﭼـﯜﻥ »ﻛـﻮﺩ ﺳـﺎﻧﺪﯗﻗﻰ«،‬ ‫»ﻛﻮﺩ ﺋﯧﻠﯩﭗ ﻳﯜﺭﮔﯜﭺ« ﺩﯦﮕﻪﻧﺪﻩﻙ ﺑﯩﺮ ﻗﯩﺴﯩﻢ ﺳـﯚﺯ ﺑﯩﺮﯨﻜﻤﯩﻠﯩﺮﻧـﻰ ﺋـﻮﻳﻼﭖ ﺑـﺎﻗﺘﯩﻢ، ﻟـﯧﻜﯩﻦ »ﻛـﻮﺩ‬ ‫ﻗﺎﭘﭽﯘﻗﻰ« ﺩﻩﭖ ﺋﺎﺗﺎﺵ ﺋﻪﯓ ﻣﯘﯞﺍﭘﯩﻖ ﺗﯘﻳﯘﻟﺪﻯ.‬ ‫ﭼـﺎﻗﯩﺮﻏﯘ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩـﺴﻰ: ‪ ،callback‬ﺧﻪﻧﺰﯗﭼﯩـﺴﻰ: ‪ 回调‬ﺑﻮﻟـﯘﭖ، ﭼـﺎﻗﯩﺮﯨﺶ ﺩﯦـﮕﻪﻥ ﻣﻪﻧﯩـﺪﻩ.‬ ‫ـ‬ ‫ـ‬ ‫ﭘﺮﻭﮔﺮﺍﻣﻤﯩﺪﺍ ﺑﯩﺮ ﺩﺍﻧﻪ ‪ callback‬ﻣﻪﻟﯘﻡ ﻛﻮﺩ ﺑﯚﻟﯩﻜﯩﮕﻪ ﺗﻮﻏﺮﯨﻼﻧﻐﺎﻥ ﺋﯩـﺴﺘﺮﯦﻠﻜﯩﻐﺎ ﺋﯘﻻﻧﻐـﺎﻥ ﺑﻮﻟﯩـﺪﯗ.‬ ‫‪ callback‬ﻧﻰ ﺋﯩﺠـﺮﺍ ﻗﯩﻠﯩـﺶ ﺋـﺎﺭﻗﯩﻠﯩﻖ ﺋـﯘ ﺗﻮﻏﺮﯨﻼﻧﻐـﺎﻥ ﻛـﻮﺩ ﺑـﯚﻟﯩﻜﯩﻨﻰ ﺋﯩﺠـﺮﺍ ﻗﯩﻠﻐﯩﻠـﻰ ﺑﻮﻟﯩـﺪﯗ.‬ ‫ﺩﯦﻤﻪﻙ ﺋﯘ ﺋﻪﺷﯘ ﻛﻮﺩ ﺑﯚﻟﯩﻜﯩﻨﯩـﯔ ﭼﺎﻗﯩﺮﻏﯘﭼﯩـﺴﻰ، ﺷـﯘﯕﺎ ﺋـﯘ »ﭼـﺎﻗﯩﺮﻏﯘ«. ﺑـﯘ ﻣﯘﺷـﯘﻧﺪﺍﻕ ﺋﺎﺗﺎﺷـﻘﺎ‬ ‫ﻳﯧﺘﻪﺭﻟﯩﻚ ﺋﺎﺳﺎﺱ ﺑﯩﻠﯩﻨﺪﻯ.‬ ‫ﺩﻩﺳــﺘﻪ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩــﺴﻰ: ‪ ،stack‬ﺧﻪﻧﺰﯗﭼﯩــﺴﻰ: ‪ 栈‬ﺑﻮﻟــﯘﭖ، ﺷــﻪﻳﺌﯩﻠﻪﺭﻧﯩﯔ ﺋﯜﺳــﺘﯩﻤﯘ-ﺋﯜﺳــﺘﻰ‬ ‫ﺗﯩﺰﯨﻠﻐﺎﻥ ﺩﻩﺳﺘﯩﺴﯩﻨﻰ ﻛﯚﺭﺳﯩﺘﯩﺪﯗ. ﭘﺮﻭﮔﺮﺍﻣﻤﯩﺪﯨﻜﻰ ‪ stack‬ﺑﻮﻟﺴﺎ ﺑﯩﺮ ﺧﯩﻞ ﺋﺎﻻﮬﯩﺪﻩ ﺳﺎﻧﻠﯩﻖ ﻣﻪﻟﯘﻣﺎﺕ‬ ‫ﻗﯘﺭﯗﻟﻤﯩﺴﻰ ﺑﻮﻟـﯘﭖ، ﺋﯘﻧﯩـﯔ ﻗﯘﺭﯗﻟﻤﯩـﺴﻰ ﺧـﯘﺩﺩﻯ ﺗﻪﺧـﺴﻪ ﺗﯩﺰﻏﺎﻧﻐـﺎ ﺋﻮﺧـﺸﺎﻳﺪﯗ. ﻳﻪﻧـﻰ، ﺗﻪﺧـﺴﯩﻠﻪﺭ‬ ‫ﺑﯩﺮﯨﻨﯩـﯔ ﺋﯜﺳـﺘﯩﮕﻪ ﺑﯩـﺮ ﻗﻮﻳﯘﻟﯩـﺪﯗ. ﺋـﯘﻻﺭﻧﻰ ﺋـﯧﻠﯩﺶ ﺋﯜﭼـﯜﻥ ﺋﻪﯓ ﺗﯚﭘﯩـﺪﯨﻦ ﺑﯩـﺮ-ﺑﯩـﺮﻟﻪﭖ ﺋـﯧﻠﯩﺶ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻛﯧﺮﻩﻙ، ﺩﯦﻤﻪﻙ ﺋﻪﯓ ﺋﺎﺧﯩﺮﯨﺪﺍ ﺗﯩﺰﯨﻠﻐﯩﻨﻰ ﺋﻪﯓ ﺑﺎﺷﺘﺎ ﺋﯧﻠﯩﻨﯩﺪﯗ، ﺋﻪﯓ ﺑﺎﺷﺘﺎ ﺗﯩﺰﯨﻠﻐﯩﻨﻰ ﺋﻪﯓ ﺋﺎﺧﯩﺮﯨـﺪﺍ‬ ‫ﺋﯧﻠﯩﻨﯩﺪﯗ. ﺑﯘ ﺟﻪﺭﻳﺎﻧﻨﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﺭﻩﺳﯩﻤﺪﯨﻜﯩﺪﻩﻙ ﺋﯩﭙﺎﺩﯨﻠﻪﺵ ﻣﯘﻣﻜﯩﻦ:‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫6‬ ‫ﺋﻪﯓ ﻛﯧﻴﯩﻦ ﺗﯩﺰﯨﻠﻐﺎﻥ ﺗﻪﺧﺴﻪ‬ ‫ﺋﻪﯓ ﺑﯘﺭﯗﻥ ﺗﯩﺰﯨﻠﻐﺎﻥ ﺗﻪﺧﺴﻪ‬ ‫ﺷﯘﯕﺎ ﺑﯘ ﺧﯩﻞ ﺳﺎﻧﻠﯩﻖ ﻣﻪﻟﯘﻣﺎﺕ ﻗﯘﺭﯗﻟﻤﯩﺴﻰ ﺩﻩﺳﺘﻪ ﺩﻩﭖ ﺋﯧﻠﯩﻨﺪﻯ.‬ ‫ﺋﯚﻣﯜﺭ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩـﺪﺍ: ‪ ،lifetime‬ﺧﻪﻧﺰﯗﭼﯩـﺪﺍ: ‪ 生命周期‬ﺑﻮﻟـﯘﭖ، ﺋﯚﻣـﯜﺭﻯ ﺩﯦـﮕﻪﻥ ﻣﻪﻧﯩـﺪﻩ. ﺋـﯘ‬ ‫ﭘﺮﻭﮔﺮﺍﻣﻤﯩﺪﺍ ﻣﻪﻟﯘﻡ ﺋﯚﺯﮔﻪﺭﮔﯜﭼﻰ ﻣﯩﻘـﺪﺍﺭﻧﯩﯔ ﺋـﯚﺯﻯ ﺗﯘﺭﻏـﺎﻥ ﻛـﻮﺩ ﺑﯚﻟﯩﻜﯩـﺪﻩ ﺋﯜﻧﯜﻣﻠـﯜﻙ ﺑﻮﻻﻻﻳـﺪﯨﻐﺎﻥ‬ ‫ﯞﺍﻗﯩــﺖ ﺋﯘﺯﯗﻧﻠــﯘﻗﯩﻨﻰ ﻛﯚﺭﺳــﯩﺘﯩﺪﯗ. ﻣﻪﺳــﯩﻠﻪﻥ، ﺗﯚﯞﻩﻧــﺪﯨﻜﻰ ﭘﺮﻭﮔﺮﺍﻣﻤﯩــﺪﺍ ﺋﻮﺧــﺸﯩﻤﯩﻐﺎﻥ ﺋﻮﺭﯗﻧــﺪﺍ‬ ‫ﺋﯧﻨﯩﻘﻼﻧﻐﺎﻥ ﺋﯚﺯﮔﻪﺭﮔﯜﭼﻰ ﻣﯩﻘﺪﺍﺭﻻﺭﻧﯩﯔ ﺋﯜﻧﯜﻣﻠﯜﻙ ﻣﻪﺯﮔﯩﻠﻰ ﺋﻮﺧﺸﺎﺵ ﺑﻮﻟﻤﺎﻳﺪﯗ.‬ ‫ ‪public class MisalClass‬‬ ‫ {‬ ‫ ;1 = 1‪    public int ozgerguchi‬‬ ‫     ‬ ‫ )(‪    public int misalFun‬‬ ‫ {  ‬ ‫ ‬ ‫ ; 1 + 1‪        int ozgerguchi2 = ozgerguchi‬‬ ‫ ;2‪        return ozgerguchi‬‬ ‫ }  ‬ ‫ ‬ ‫ }‬ ‫ﻳ ـﯘﻗﯩﺮﯨﻘﻰ ﻛﻮﺩﺗ ـﺎ 1‪ ozgerguchi‬ﻧﯩ ـﯔ ﺋﯜﻧﯜﻣﻠ ـﯜﻙ ﻣﻪﺯﮔﯩﻠ ـﻰ ‪ MisalClass‬ﻧﯩﯖﻜ ـﻰ ﺑﯩ ـﻠﻪﻥ ﺋﻮﺧ ـﺸﺎﺵ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﻮﻟﯘﭖ، ‪ MisalClass‬ﻣﻪﯞﺟـﯘﺗﻼ ﺑﻮﻟﯩـﺪﯨﻜﻪﻥ ﺋﯘﻣـﯘ ﻣﻪﯞﺟـﯘﺩ ﺑﻮﻟـﯘﭖ ﺗﯘﺭﺍﻻﻳـﺪﯗ. 2‪ ozgerguchi‬ﻧﯩـﯔ‬ ‫ﺋﯜﻧﯜﻣﻠﯜﻙ ﻣﻪﺯﮔﯩﻠـﻰ ﻗﯩـﺴﻘﯩﺮﺍﻕ ﺑﻮﻟـﯘﭖ، ‪ misalFun‬ﻓﯘﻧﻜﺴﯩﻴﯩـﺴﯩﻨﯩﯔ ﺋﯩﺠﺮﺍﺳـﻰ ﺑﺎﺷﻠﯩﻨﯩـﺸﻰ ﺑﯩﻠﻪﻧـﻼ‬ ‫ﺋﯜﻧﯜﻡ ﺑﻮﻟﯘﺷﻘﺎ ﺑﺎﺷﻼﭖ، ﺋﯩﺠﺮﺍ ﺗﺎﻣﺎﻣﻼﻧﻐﺎﻧﺪﺍ ﺋﯜﻧﯜﻣـﺴﯩﺰﻟﯩﻨﯩﺪﯗ. ﺋﯚﺯﮔﻪﺭﮔـﯜﭼﻰ ﻣﯩﻘـﺪﺍﺭﻻﺭﻧﯩﯔ ﺑـﯘ ﺧﯩـﻞ‬ ‫ﺧﺎﺳﻠﯩﻘﯩﻨﻰ ﺋﯘﻧﯩﯔ »ﺋﯚﻣﺮﻯ« ﺩﻩﭖ ﺋﺎﺗﺎﺵ ﻣﯘﯞﺍﭘﯩﻖ ﺑﯩﻠﯩﻨﺪﻯ.‬ ‫‪ ،(Intermediate‬ﺧﻪﻧﺰﯗﭼﯩــﺴﻰ ‪ 中间语言‬ﺑﻮﻟــﯘﭖ،‬ ‫ﺋﯚﺗﻜــﯜﻧﭽﻰ ﻛــﻮﺩ- ﺋﯩﻨﮕﻠﯩﺰﭼﯩــﺴﻰ ‪Code)IL‬‬ ‫‪ .NET‬ﺋﺎﺋﯩﻠﯩﺴﯩﺪﯨﻜﻰ ﺗﯩﻠﻼﺭﺩﺍ ﻳﯧﺰﯨﻠﻐـﺎﻥ ﻛـﻮﺩﻻﺭ ﺋﺎﺧﯩﺮﯨـﺪﺍ ﮬﻪﻣﻤﯩـﺴﯩﮕﻪ ﺋﻮﺭﺗـﺎﻕ ﺑﻮﻟﻐـﺎﻥ ‪ IL‬ﺗﯩﻠﯩﻐـﺎ‬ ‫ﺋﺎﻳﻼﻧـﺪﯗﺭﯗﻟﯘﭖ، ﮬﻪﻗﯩﻘـﻰ ﺋﯩﺠـﺮﺍ ﺑﻮﻟﻐﺎﻧـﺪﺍ ﺋﯘﻣـﯘ ﻳﻪﻧﻪ ﻣﺎﺷـﯩﻨﺎ ﺗﯩﻠﯩﻐـﺎ ﺋﺎﻳﻠﯩﻨﯩـﺪﯗ. ﺋﻪﻣﻪﻟﯩﻴﻪﺗـﺘﻪ، #‪C‬‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﯩﻠﻪﻥ ‪ VB.NET‬ﻳﯧﺰﯨﻠﻐﺎﻥ ﻛـﻮﺩﻻﺭﻧﻰ ﺋـﺎﺭﻻﺵ ﺋﯩﺸﻠﯩﺘﯩـﺸﻜﻪ ﻣـﯘﻣﻜﯩﻦ ﺑﻮﻟﯩـﺪﯨﻐﺎﻧﻠﯩﻘﯩﻨﯩﯔ ﺳـﻪﯞﻩﺑﯩﻤﯘ‬ ‫ﺷﯘ. ﺋﯘ ﺧﺎﺭﺍﻛﺘﯧﺮﯨﮕﻪ ﺋﺎﺳﺎﺳﻪﻥ »ﺋﯚﺗﻜﯜﻧﭽﻰ ﻛﻮﺩ« ﺩﻩﭖ ﺋﯧﻠﯩﻨﺪﻯ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫7‬ ‫ﺗﯩﻠﻼﺭﻏﺎ ﺋﻮﺭﺗﺎﻕ ﺋﯩﺠﺮﺍ ﺳﯘﭘﯩـﺴﻰ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩـﺴﻰ ‪ ،Common Language Runtime‬ﺧﻪﻧﺰﯗﭼﯩـﺴﻰ:‬ ‫‪ 通用语言运行库‬ﺑﻮﻟﯘﭖ، ‪ .NET‬ﺋﺎﺋﯩﻠﯩـﺴﯩﺪﯨﻜﻰ ﺗﯩﻠـﻼﺭﺩﺍ ﺗـﯜﺯﯛﻟﮕﻪﻥ ﭘﺮﻭﮔـﺮﺍﻣﻤﯩﻼﺭ ﺋﯩﺠـﺮﺍ ﺑﻮﻟـﯘﺵ‬ ‫ﺋﯜﭼﯜﻥ ﺯﯙﺭﯛﺭ ﺋﺎﺳﺎﺱ ﺑﻮﻟﯩﺪﯨﻐﺎﻥ ﺋﯩﺠﺮﺍ ﺳﯘﭘﯩﺴﯩﺪﯗﺭ. ﺋﯘﻧﯩﯔ ﺧﺎﺭﺍﻛﺘﯧﺮﻯ ﭼﯩﻘﯩﺶ ﻗﯩﻠﯩﻨﯩﭗ »ﺗﯩﻠﻼﺭﻏـﺎ‬ ‫ﺋﻮﺭﺗﺎﻕ ﺋﯩﺠﺮﺍ ﺳﯘﭘﯩﺴﻰ« ﺩﻩﭖ ﺋﯧﻠﯩﻨﺪﻯ.‬ ‫ﺗﯩــﭗ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩــﺴﻰ: ‪ ،Type‬ﺧﻪﻧﺰﯗﭼﯩــﺴﻰ:‪ 类型‬ﺑﻮﻟــﯘﭖ، ﺗــﯜﺭﻯ، ﺗﯩﭙــﻰ ﺩﯦــﮕﻪﻥ ﻣﻪﻧﯩــﻠﻪﺭﺩﻩ.‬ ‫ﭘﺮﻭﮔﺮﺍﻣﻤﯩﺪﯨﻜﻰ ‪ Type‬ﺑﻮﻟـﺴﺎ ﭘﺮﻭﮔﺮﺍﻣﻤﯩـﺪﯨﻜﻰ ﻣﻪﻟـﯘﻡ ﺋﯚﺯﮔﻪﺭﮔـﯜﭼﻰ ﻣﯩﻘـﺪﺍﺭﻧﯩﯔ ﺋﯚﺯﯨـﺪﻩ ﺳـﺎﻗﻼﻧﻐﺎﻥ‬ ‫ﺋﯘﭼﯘﺭﻧﯩـﯔ ﺧـﺎﺭﺍﻛﺘﯧﺮﯨﮕﻪ ﺋﺎﺳﺎﺳـﻪﻥ ﺑﯚﻟـﯜﻧﮕﻪﻥ ﺗﯩﭙﯩﻨـﻰ ﺋﯩﭙﺎﺩﯨﻠﻪﻳـﺪﯗ. ﻟـﯧﻜﯩﻦ ﺋـﯘ ‪ (类) Class‬ﺩﯨـﻦ‬ ‫ـ‬ ‫ـ‬ ‫ﭘﻪﺭﻗﻠﯩﻨﯩﺪﯗ.‬ ‫ﺗﯜﺭ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩﺴﻰ: ]‪ ،Class[klɑ:s‬ﺧﻪﻧﺰﯗﭼﯩﺴﻰ: ‪ 类‬ﺑﻮﻟﯘﭖ. ﺗﯩﭗ، ﺗﯜﺭ ﺩﯦﮕﻪﻥ ﻣﻪﻧﯩﺪﻩ. ﻟـﯧﻜﯩﻦ‬ ‫ﺑﯘ ﺗﯩﭗ ‪ (类型)Type‬ﺑﯩﻠﻪﻥ ﺩﻭﻗﺎﻝ ﻛﯧﻠﯩﭗ ﻗﺎﻟﻐﺎﻧﻠﯩﻘﻰ ﺋﯜﭼﯜﻥ ﺗﯜﺭ ﺩﻩﭖ ﺋﯧﻠﯩﻨﺪﻯ. ﺋﯘﻧﯩﯖﺪﯨﻦ ﺑﺎﺷـﻘﺎ‬ ‫‪ project, 项目‬ﻧﯩﻤﯘ ﺗﯜﺭ ﺩﻩﭖ ﺋﯧﻠﯩﺶ ﻣﯘﯞﺍﭘﯩﻖ، ﺷﯘﯕﺎ ﺑﯘ ﻛﯩﺘﺎﭘﺘـﺎ »ﺗـﯜﺭ« ﮬﻪﻡ ‪ class‬ﮬﻪﻡ ‪project‬‬ ‫ﺩﯦــﮕﻪﻥ ﻣﻪﻧﯩﻠﻪﺭﻧــﻰ ﺑﯧﺮﯨــﺪﯗ. ﺯﺍﺩﻯ ﻗﺎﻳــﺴﻰ ﻣﻪﻧﯩــﺪﻩ ﻛﻪﻟﮕﻪﻧﻠﯩﻜــﻰ ﺋــﯚﺯﻯ ﺗﯘﺭﯗﺷــﻠﯘﻕ ﻣﻪﺯﻣﯘﻧــﺪﯨﻦ‬ ‫ﻛﻪﻟﺘﯜﺭﯛﯞﯦﻠﯩﻨﯩﺪﯗ.‬ ‫ﻣﯧﺘﻮﺩ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩﺴﻰ: ]‪ ،Method['meθəd‬ﺧﻪﻧﺰﯗﭼﯩﺴﻰ: ‪ 方法,函数‬ﺑﻮﻟـﯘﭖ، ﭘﺮﻭﮔﺮﺍﻣﻤﯩـﺪﺍ ﺑﯩـﺮ‬ ‫ﺑﯚﻟﻪﻙ ﯞﻩﺯﯨﭙﯩﻨﻰ ﻣﯘﺳﺘﻪﻗﯩﻞ ﺋﻮﺭﯗﻧﻼﻳﺪﯨﻐﺎﻥ ﻛـﻮﺩ ﺑـﯚﻟﯧﻜﯩﻨﻰ ﻛﯚﺭﺳـﯩﺘﯩﺪﯗ. ﺳـﯚﺯ ﻣﻪﻧﯩـﺴﯩﺪﯨﻦ ﺋﺎﻟﻐﺎﻧـﺪﺍ‬ ‫»ﺋﯘﺳﯘﻝ« ﺩﯦﮕﻪﻥ ﻣﻪﻧﺎ ﺑﯧﺮﯨﺪﯗ. ﻟﯧﻜﯩﻦ ﭘﺮﻭﮔﺮﺍﻣﻤﯩـﺪﯨﻜﻰ ﺧﺎﺭﺍﻛﺘﯧﺮﯨـﺪﯨﻦ ﺋﺎﻟﻐﺎﻧـﺪﺍ ﺋـﯘﻧﻰ »ﺋﯘﺳـﯘﻝ«‬ ‫ﺩﻩﭖ ﺋﺎﺗﺎﺵ ﻣﯘﯞﺍﭘﯩﻖ ﺑﯩﻠﯩﻨﻤﯩﮕﻪﭼﻜﻪ، ﺑﯘ ﻛﯩﺘﺎﺑﺘﺎ ﻣﯧﺘﻮﺩ ﺩﻩﭖ ﺋﯧﻠﯩﻨﺪﻯ.‬ ‫ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤﻪ – ﺋﯧﻨﮕﯩﻠﯩﺰﭼﯩـﺴﻰ: ]‪ ،Compile [kəm'pail‬ﺧﻪﻧﺰﯗﭼﯩـﺴﻰ: ‪ 编译‬ﺑﻮﻟـﯘﭖ، ﻛﻮﻣﭙﻴـﯘﺗﯧﺮ‬ ‫ﺗﯩﻠﯩﺪﺍ ﻳﯧﺰﯨﻠﻐﺎﻥ ﻛﻮﺩﻧﻰ ﺑﺎﺷﻘﺎ ﺑﯩﺮ ﺧﯩﻞ ﻛﻮﻣﭙﻴﯘﺗﯧﺮ ﺗﯩﻠﯩﻐﺎ ﺗﻪﺭﺟﯩﻤﻪ ﻗﯩﻠﯩـﺶ ﺟﻪﺭﻳـﺎﻧﯩﻨﻰ ﻛﯚﺭﺳـﯩﺘﯩﺪﯗ‬ ‫)ﺑــﯘ ﻣﻪﺷــﻐﯘﻻﺗﻨﻰ ﻛﯚﭘــﯜﻧﭽﻪ ﺷــﯘ ﻛــﻮﺩﻧﻰ ﻳﺎﺯﻏــﺎﻥ ‪ IDE‬ﺋﻮﺭﯗﻧﻼﻳــﺪﯗ(. ﺑــﯘ ﺟﻪﺭﻳــﺎﻧﻨﻰ ‪ 编辑‬ﻳﻪﻧــﻰ‬ ‫ﺗﻪﮬﺮﯨﺮﻟﻪﺵ ﺩﯨﻴﯩﺸﻜﻪ ﺑﻮﻟﻤﺎﻳﺪﯗ. ﻣﻪﺷﻐﯘﻻﺗﻨﯩﯔ ﺟﻪﺭﻳﺎﻥ ﺧﺎﺭﺍﻛﺘﯧﺮﻯ ﭼﯩﻘﯩﺶ ﻗﯩﻠﯩﻨﯩﭗ ﻛﻮﺩ-ﺗﻪﺭﺟﯩـﻤﻪ‬ ‫ﺩﻩﭖ ﺋﯧﻠﯩﻨــﺪﻯ. ﻛــﻮﺩ ﺗﻪﺭﺟﯩــﻤﻪ ﻣﻪﺷــﻐﯘﻻﺗﯩﻨﻰ ﺋﯧﻠﯩــﭗ ﺑــﺎﺭﻏﯘﭼﻰ ﺑﻮﻟــﺴﺎ »ﻛــﻮﺩ-ﺗﻪﺭﺟﯩﻤــﺎﻥ« ﺩﻩﭖ‬ ‫ﺋﯧﻠﯩﻨﺪﻯ.‬ ‫ﻣـــﯘﯞﻩﻗﻘﻪﺕ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩـــﺴﻰ ‪ ،delegate‬ﺧﻪﻧﺰﯗﭼﯩـــﺴﻰ ‪ 委托‬ﺑﻮﻟـــﯘﭖ، ﯞﻩﻛﯩـــﻞ، ﮬـــﺎﯞﺍﻟﻪ،‬ ‫ﻣﯘﯞﻩﻗﻘﻪﺕ ﺩﯦﮕﻪﻥ ﻣﻪﻧﯩﻠﻪﺭﺩﻩ. ﭘﺮﻭﮔﺮﺍﻣﻤﯩﺪﺍ ‪ delegate‬ﺧﺎﺳﻠﯩﻘﻰ ﺑﯧﺮﯨﻠﮕﻪﻥ ﺗﯩﭙﻼﺭ ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ‬ ‫ﺑﺎﺷﻘﺎ ﻛﻮﺩﻻﺭﻧﯩـﯔ ﺋﺎﺩﺭﯦـﺴﯩﻨﻰ ﺳـﺎﻗﻼﻳﺪﯨﻐﺎﻥ ﯞﻩﻛﯩـﻞ ﺗﯩـﭙﻼﺭﺩﯗﺭ. ﺷـﯘﯕﺎ »ﻣـﯘﯞﻩﻗﻘﻪﺕ« ﺩﻩﭖ‬ ‫ﺋﯧﻠﯩﻨﺪﻯ.‬ ‫ﺧﯘﻟ ـﻖ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩ ـﺴﻰ ‪ behavior‬ﺑﻮﻟ ـﯘﭖ، ﭘﺮﻭﮔﺮﺍﻣﻤﯩ ـﺪﺍ ﻣﻪﻟ ـﯘﻡ ﻛﻮﺩﻧﯩ ـﯔ ﺋﯩﺠ ـﺮﺍ ﺑﻮﻟ ـﯘﺵ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﺎﻻﮬﯩــﺪﯨﻠﯩﻜﯩﻨﻰ ﯞﻩ ﺧﯩــﺰﻣﻪﺕ ﭘﯩﺮﯨﻨــﺴﯩﭙﯩﻨﻰ ﻛﯚﺭﺳــﯩﺘﯩﺪﯗ. ﺩﯦــﻤﻪﻙ ﺋــﯘ ﺷــﯘ ﭘﺮﻭﮔﺮﺍﻣﻤﯩﻨﯩــﯔ‬ ‫ﺧﯘﻟﻘﻰ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫8‬ ‫ﺧﺎﺱ ﺳﯚﺯ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩﺴﻰ: ‪ ،Key Word‬ﺧﻪﻧﺰﯗﭼﯩﺴﻰ: ‪ 关键词,保留词‬ﺑﻮﻟـﯘﭖ، ﮬﻪﺭﺑﯩـﺮ‬ ‫ﭘﺮﻭﮔﺮﺍﻣﻤﺎ ﺗﯩﻠﯩﺪﺍ ﭘﺮﻭﮔﺮﺍﻣﻤﯧﺮﻻﺭ ﺗﻪﺭﯨﭙﯩﺪﯨﻦ ﺋﯩﺸﻠﯩﺘﯩﺸﻜﻪ ﺑﻮﻟﻤﺎﻳﺪﯨﻐﺎﻥ ﺑﯩﺮ ﻗﯩﺴﯩﻢ ﺳـﯚﺯﻟﻪﺭﻧﻰ‬ ‫ﻛﯚﺭﺳـﯩﺘﯩﺪﯗ. ﻣﻪﺳـﯩﻠﻪﻥ، #‪ C‬ﺗﯩﻠﯩـﺪﺍ …‪ int, float, delegate, public, static‬ﻗﺎﺗـﺎﺭﻟﯩﻖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺳﯚﺯﻟﻪﺭ ﺧﺎﺱ ﺳﯚﺯﻟﻪﺭﮔﻪ ﺗﻪﯞﻩ ﺑﻮﻟﯘﭖ ﺋﯘﻻﺭﻧﻰ ﺋﯚﺯﮔﻪﺭﮔﯜﭼﻰ ﻣﯩﻘﺪﺍﺭﻻﺭﻧﯩﯔ ﺋﯩﺴﯩﻤﻰ ﺳﯜﭘﯩﺘﯩﺪﻩ‬ ‫ﻗﻮﻟﻠﯩﻨﯩﺸﯩﻤﯩﺰﻏﺎ ﻳﻮﻝ ﻗﻮﻳﯘﻟﻤﺎﻳـﺪﯗ. ﺑﯘﻧـﺪﺍﻕ ﺳـﯚﺯﻟﻪﺭ ﮬﻪﺭﺑﯩـﺮ ﺗﯩﻠﻨﯩـﯔ ﺋـﯚﺯﻯ ﺋﯜﭼـﯜﻥ ﺧـﺎﺱ‬ ‫ﺑﻮﻟﻐﺎﻧﻠﯩﻘﻰ ﺋﯜﭼﯜﻥ ﺋﯘﻻﺭ »ﺧﺎﺱ ﺳـﯚﺯ« ﺩﻩﭖ ﺋﯧﻠﯩﻨـﺪﻯ. ﻟـﯧﻜﯩﻦ ﺋـﺎﭼﻘﯘﭼﻠﯘﻕ ﺳـﯚﺯ، ﻳﻪﻧـﻰ‬ ‫‪ 关键词‬ﺧﺎﺱ ﺳﯚﺯﺩﯨﻦ ﭘﻪﺭﻗﻠﯩﻨﯩﺪﯨﻐﺎﻥ ﺑﻮﻟﯘﭖ، ﺋﯘﻧﯩﯔ ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺶ ﺩﺍﺋﯩﺮﯨﺴﻰ ﻛﻪﯕﺮﻩﻙ. ﺋـﯘ‬ ‫ﻣﻪﻟﯘﻡ ﻧﻪﺗﯩﺠﯩﮕﻪ ﺋﯧﺮﯨﺸﯩﺶ ﺋﯜﭼﯜﻥ ﺗﻪﻣﯩﻨﻠﯩﮕﻪﻥ ﺋﺎﭼﻘﯘﭼﻠﯘﻕ ﺋﯘﭼﯘﺭﻧﻰ ﻛﯚﺭﺳﯩﺘﯩﺪﯗ.‬ ‫ﺑﯩﻨﻮﺭﻣـــﺎﻟﻠﯩﻖ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩـــﺴﻰ: ‪ ،Exceprion‬ﺧﻪﻧﺰﯗﭼﯩـــﺴﻰ: ‪ 异常‬ﺑﻮﻟـــﯘﭖ، ﺗﺎﺳـــﺎﺩﺩﯨﭙﻠﯩﻖ،‬ ‫ﺑﯩﻨﻮﺭﻣـﺎﻟﻠﯩﻖ ﺩﯦـﮕﻪﻥ ﻣﻪﻧﯩﻠﻪﺭﻧ ـﻰ ﺑﯧﺮﯨـﺪﯗ. ﭘﺮﻭﮔﺮﺍﻣﻤﯩ ـﺪﺍ ﺋـﯘ ﭘﺮﻭﮔﺮﺍﻣﻤـﺎ ﺋﯩﺠ ـﺮﺍ ﺟﻪﺭﻳﺎﻧﯩـﺪﺍ ﺧﺎﺗ ـﺎﻟﯩﻖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻛﯚﺭﯛﻟﺴﻪ ﮬﺎﺳﯩﻞ ﺑﻮﻟﯩـﺪﯨﻐﺎﻥ ﺧﺎﺗـﺎﻟﯩﻖ ﺗﯩﭙﯩﻨﯩـﯔ ﺋﻮﺭﺗـﺎﻕ ﻧـﺎﻣﻰ. ﻣﻪﺳـﯩﻠﻪﻥ، ;0/1=‪ int i‬ﺑـﯘ ﺟـﯜﻣﻠﻪ‬ ‫‪ IDE‬ﺗﻪﺭﯨﭙﯩ ـﺪﯨﻦ ﺧﺎﺗ ـﺎﻟﯩﻖ ﻳ ـﻮﻕ ﺩﻩﭖ ﻗﺎﺭﯨﻠﯩ ـﺪﯗ. ﺋﻪﻣﻤ ـﺎ ﮬﻪﺭﻗﺎﻧ ـﺪﺍﻕ ﺳ ـﺎﻧﻨﻰ 0 ﮔﻪ ﺑﯚﻟ ـﺴﻪ ﻣﻪﻧﯩ ـﺴﯩﺰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﻮﻟﯩـــــﺪﯨﻐﺎﻧﻠﯩﻘﻰ ﺋﯜﭼـــــﯜﻥ ﭘﺮﻭﮔﺮﺍﻣﻤـــــﺎ ﺋﯩﺠـــــﺮﺍ ﺑﻮﻟـــــﯘﭖ ﻣﯘﺷـــــﯘ ﺟـــــﯜﻣﻠﯩﮕﻪ ﻛﻪﻟﮕﻪﻧـــــﺪﻩ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫‪ DevidedByZeroException‬ﺗﯩﭙﻠﯩــﻖ ﺧﺎﺗــﺎﻟﯩﻖ ﺋــﻮﺑﻴﯧﻜﺘﻰ ﮬﺎﺳــﯩﻞ ﻗﯩﻠﯩــﺪﯗ. ﺑــﯘ ﺧﯩــﻞ ﮬﺎﺩﯨــﺴﻪ‬ ‫»ﺑﯩﻨﻮﺭﻣــﺎﻟﻠﯩﻖ« ﺩﻩﭖ ﺋﯧﻠﯩﻨــﺪﻯ. ﻣﻪﺳــﯩﻠﻪﻥ، ﺑﺎﻳــﺎﻣﻘﻰ ﺟﻪﺭﻳﺎﻧــﺪﺍ ‪DevidedByZeroException‬‬ ‫ﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﭼﯩﻘﯩﺮﯨﻠﯩﺪﯗ.‬ ‫ﺗﯩﺰﻣﺎ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩﺴﻰ: ‪ ،Sequance‬ﺧﻪﻧﺰﯗﭼﯩﺴﻰ: ‪ 串‬ﺑﻮﻟﯘﭖ، ﺑﯩﺮﻗﺎﻧﭽﻪ ﺋﯧﻠﯧﻤﯧﻨﺘﻼﺭﻧﯩـﯔ ﺭﻩﺗﻠﯩـﻚ‬ ‫ﻗﺎﺗــﺎﺭﯨﻨﻰ ﻛﯚﺭﺳــﯩﺘﯩﺪﯗ. ﭘﺮﻭﮔﺮﺍﻣﻤﯩــﺪﺍ، ‪ Sequance‬ﺋﯩﭽﯩــﺪﯨﻜﻰ ﺋﯧﻠﯧﻤﯧﻨــﺘﻼﺭ ﺗﻪﺭﺗﯩﭙﻠﯩــﻚ ﺗﯩﺰﯨﻠﻐــﺎﻥ‬ ‫ﺑﻮﻟ ـﯘﭖ، ﺋﯘﻻﺭﻏــﺎ ﻧﯚﻟــﺪﯨﻦ ﺑﺎﺷــﻼﻧﻐﺎﻥ ﺗﻪﺭﺗﯩــﭗ ﻧﻮﻣ ـﯘﺭﻯ ﻗﻮﻳﯘﻟﻐــﺎﻥ ﺑﻮﻟﯩــﺪﯗ. ﺋﯘﻻﺭﻧﯩــﯔ ﺗﻪﺭﺗﯩﭙﻠﯩــﻚ‬ ‫ـ‬ ‫ـ‬ ‫ﺗﯩﺰﯨﻠﻐﺎﻥ ﺋﺎﻻﮬﯩﺪﯨﻠﯩﻜﯩﻨﻰ ﻛﯚﺯﺩﻩ ﺗﯘﺗﯘﭖ ﺋﯘﻻﺭﻧﻰ »ﺗﻮﭘﻼﻡ« ﺩﻩﭖ ﺋﯧﻠﯩـﺸﻨﯩﯔ ﺋﻮﺭﻧﯩﻐـﺎ »ﺗﯩﺰﻣـﺎ« ﺩﻩﭖ‬ ‫ﺋﯧﻠﯩﻨﺪﻯ. ﮔﻪﺭﭼﻪ ‪ (集合)Collection‬ﻣﯘ ﺋﯧﻠﯧﻤﯧﻨﺘﻼﺭﻧﯩﯔ ﺗﻮﭘﻰ ﺑﻮﻟﺴﯩﻤﯘ، ﺋـﯘ ﺳـﻪﻝ ﺋﺎﺑـﺴﺘﺮﺍﻛﺘﺮﺍﻕ‬ ‫ﺑﻮﻟــﯘﭖ، ﺋﯘﻧﯩــﯔ ﺋﯩﭽﯩــﺪﯨﻜﻰ ﺋﯧﻠﯧﻤﯧﻨــﺘﻼﺭ ﺗﻪﺭﺗﯩﭙﻠﯩــﻚ ﺑﻮﻟﯘﺷــﯩﻤﯘ ﻣــﯘﻣﻜﯩﻦ، ﺗﻪﺭﺗﯩﭙــﺴﯩﺰ ﺑﻮﻟﯘﺷــﯩﻤﯘ‬ ‫ﻣﯘﻣﻜﯩﻦ. ﻣﻪﺳﯩﻠﻪﻥ، ‪ Hashtable‬ﺩﯨﻜﻰ ﺋﯧﻠﯧﻤﯧﻨﺘﻼﺭﻧﻰ ﺗﻪﺭﺗﯩـﭗ ﻧﻮﻣـﯘﺭﻯ ﺑﯩـﻠﻪﻥ ﺯﯨﻴـﺎﺭﻩﺕ ﻗﯩﻠﻐﯩﻠـﻰ‬ ‫ﺑﻮﻟﻤﺎﻳﺪﯗ.‬ ‫ـ‬ ‫ـ‬ ‫ﺋﻪﺯﺍ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩ ــﺴﻰ: ‪ ،Item‬ﺧﻪﻧﺰﯗﭼﯩ ــﺴﻰ: ‪ 项‬ﺑﻮﻟ ــﯘﭖ، ﻣﻪﻟ ــﯘﻡ ﺗﯩﺰﻣ ــﺎ ﺋﯩﭽﯩ ــﺪﯨﻜﻰ ﺑﯩ ــﺮ ﺩﺍﻧﻪ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﯧﻠﯧﻤﯧﻨﺘﻨــﻰ ﻛﯚﺭﺳــﯩﺘﯩﺪﯗ. ﻣﻪﺳــﯩﻠﻪﻥ }4,3,2,1{][‪ int[]  sanlar  =  new  int‬ﺩﻩﭖ‬ ‫ﺋﯧﻨﯩﻘﻼﻧﺴﺎ، 3,2,1ﯞﻩ 4 ﻟﻪﺭ ‪ sanlar‬ﻧﯩﯔ ﺋﻪﺯﺍﻟﯩﺮﯨﺪﯗﺭ.‬ ‫ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩﺴﻰ: ‪ ،Query‬ﺧﻪﻧﺰﯗﭼﯩﺴﻰ: ‪ 查询‬ﺑﻮﻟﯘﭖ، ﺋﯩﺰﺩﻩﺵ، ﺳﯜﺭﯛﺷـﺘﻪ ﻗﯩﻠﯩـﺶ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺩﯦ ــﮕﻪﻥ ﻣﻪﻧﯩ ــﻠﻪﺭﺩﻩ. ﻛﻮﻣﭙﻴ ــﯘﺗﯧﺮ ﭘﺮﻭﮔﺮﺍﻣﻤﯩﭽﯩﻠﯩﻘ ــﻰ ﺳﺎﮬﻪﺳ ــﯩﺪﻩ ﺑ ــﯘ ﺋﺎﺗ ــﺎﻟﻐﯘ ﺳ ــﺎﻧﺪﺍﻥ)‪(数据库‬‬ ‫ﻣﻪﺷﻐﯘﻻﺗﯩﺪﺍ ﺋﯩﻨﺘﺎﻳﯩﻦ ﻛﯚﭖ ﺋﯩـﺸﻠﯩﺘﯩﻠﯩﺪﯗ. ﺑﻮﻟﯘﭘﻤـﯘ ﺑـﺎﺭﻟﯩﻖ ‪ Sql‬ﺟـﯜﻣﻠﯩﻠﯩﺮﻯ ﺑﯩـﺮﺩﻩﻙ ‪ Query‬ﺩﻩﭖ‬ ‫ﺋﺎﺗﯩﻠﯩﺪﯗ. ﺑﯘ ﺧﯩـﻞ ﺋﺎﻻﮬﯩـﺪﯨﻠﯩﻜﻨﻰ ﺋﯘﻳﻐـﯘﺭ ﺗﯩﻠﯩـﺪﺍ »ﺳﯜﺭﯛﺷـﺘﯜﺭﮔﯜﭼﻰ«، »ﺋﯩـﺰﺩﻩﺵ ﺟﯜﻣﻠﯩـﺴﻰ«،‬ ‫»ﺋﯩﺰﺩﯨﮕــﯜﭼﻰ« ﺩﯦﮕﻪﻧــﺪﻩﻛﻠﻪﺭ ﺑﯩــﻠﻪﻥ ﺋﯩﭙــﺎﺩﯨﻠﻪﺵ ﻣــﯘﻣﻜﯩﻦ. ﻟــﯧﻜﯩﻦ ‪ Query‬ﺟﻪﺭﻳﺎﻧﯩﻨﯩــﯔ ﺋــﯘﻧﻰ‬ ‫ﺋﯩــﺸﻠﻪﺗﻜﯜﭼﻰ )ﺳﯜﺭﯛﺷــﺘﯜﺭﮔﯜﭼﻰ( ﺩﯨــﻦ ﭘﻪﺭﻗﻠﯩﻨﯩــﺪﯨﻐﺎﻥ ﻣﯘﺳــﺘﻪﻗﯩﻞ ﺟﻪﺭﻳــﺎﻥ ﺑﻮﻟﻐــﺎﻧﻠﯩﻘﻰ ﻛــﯚﺯﺩﻩ‬ ‫ﺗﯘﺗﯘﻟــﯘﭖ »ﺳﯜﺭﯛﺷــﺘﯜﺭ« ﺳــﯚﺯﯨﮕﻪ »ﯛﻙ« ﺳــﯚﺯ ﻳﺎﺳــﯩﻐﯘﭼﻰ ﻗﻮﺷﯘﻣﭽﯩــﺴﯩﻨﻰ ﻗﻮﺷــﯘﺵ ﺋــﺎﺭﻗﯩﻠﯩﻖ‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫9‬ ‫ﻛﯩﺘـﺎﺏ ﻣﻪﺯﻣﯘﻧﯩـﺪﺍ، ‪ SQL‬ﺳﯜﺭﯛﺷـﺘﯜﺭﯛﻛﻰ )‪ LINQ ،(SQL Query‬ﺳﯜﺭﯛﺷـﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨـﺴﻰ ) ‪LINQ‬‬ ‫‪ (Query‬ﻗﺎﺗــــﺎﺭﻟﯩﻖ‬ ‫‪ ،(Query‬ﺳﯜﺭﯛﺷــــﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨــــﺴﻰ)‪Expression‬‬ ‫‪Expression‬‬ ‫ﺑﯧﺮﯨﻠﻤﯩﺪﻯ.‬ ‫»ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ« ﻧﻰ ﺋﯚﺯ ﺋﯩﭽﯩﮕﻪ ﺋﺎﻟﻐﺎﻥ ﺋﺎﺗﺎﻟﻐﯘﻻﺭﻧﻰ ﺋﯘﭼﺮﯨﺘﯩﭗ ﺗﯘﺭﯨﺴﯩﺰ. ﺋﯘﻻﺭﻏـﺎ ﺋـﺎﻳﺮﯨﻢ ﺋﯩﺰﺍﮬـﺎﺕ‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﺋﺎﺗﺎﻟﻐﯘﻻﺭﻧﯩﯔ ﺗﻪﺭﺟﯩﻤﯩﺴﯩﻼ ﺑﯧﺮﯨﻠﺪﻯ‬ ‫ﺧﻪﻧﺰﯗﭼﯩﺴﻰ‬ ‫ﺋﯩﻨﮕﻠﯩﺰﭼﯩﺴﻰ‬ ‫ﺋﯘﻳﻐﯘﺭﭼﯩﺴﻰ‬ ‫‪静态层‬‬ ‫‪谓语‬‬ ‫‪强类型语言‬‬ ‫‪类型推导‬‬ ‫‪Static Layer‬‬ ‫‪Predicate‬‬ ‫‪Strongly Typed Language‬‬ ‫‪Type Inference‬‬ ‫‪Projection‬‬ ‫‪Enumerate‬‬ ‫ﺗﯘﺭﻏﯘﻥ ﻗﻪﯞﻩﺕ‬ ‫ﻛﯚﺭﺳﻪﺗﻤﻪ‬ ‫ﻗﺎﺗﺘﯩﻖ ﺗﯩﭙﻠﯩﻖ ﺗﯩﻞ‬ ‫ﺗﯩﭗ ﻛﻪﻟﺘﯜﺭﯛﻟﻤﯩﺴﻰ‬ ‫ﺋﻪﻣﻪﻟﯩﻴﻠﻪﺷﺘﯜﺭﯛﺵ‬ ‫ﭼﺎﺭﻻﺵ‬ ‫ﻗﯩﻤﻤﻪﺗﻠﯩﻚ ﺗﯩﭗ‬ ‫ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺗﯩﭗ‬ ‫‪值类型‬‬ ‫‪引用类型‬‬ ‫‪Value Type‬‬ ‫‪Reference Type‬‬ ‫ﺋﻪﺳﻜﻪﺭﺗﯩﺶ: ﻳﯘﻗﯩﺮﯨﻘﻰ ﺋﺎﺗﺎﻟﻐﯘﻻﺭ ﺑﯩﺮﺩﻩﻙ ﺑﯩﺮ ﻗﯩﺴﯩﻢ ﻛﻪﺳﯩﭙﺪﺍﺷﻼﺭ ﺑﯩـﻠﻪﻥ ﭘﯩﻜﯩﺮﻟﯩـﺸﯩﺶ ﺋﺎﺳﺎﺳـﯩﺪﺍ‬ ‫ﺗﻪﺭﺟﯩ ـﻤﻪ ﻗﯩﻠﯩﻨﻐ ـﺎﻥ، ﻣﯘﺷ ـﯘ ﻛﯩﺘ ـﺎﺑﺘﯩﻦ ﺑﺎﺷ ـﻘﺎ ﮬﻪﺭﻗﺎﻧ ـﺪﺍﻕ ﻣﺎﺗﯧﺮﯨﻴ ـﺎﻟﻼﺭﺩﯨﻜﻰ ﺋﻮﺧ ـﺸﺎﺵ ﺋﺎﺗﺎﻟﻐﯘﻻﺭﻏ ـﺎ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﺎﺳﺎﺱ ﺑﻮﻻﻟﻤﺎﻳﺪﯗ. ﮬﻪﻡ ﻣﻪﺯﻛﯘﺭ ﺗﻪﺭﺟﯩﻤﯩﻠﻪﺭ ﺳﻪﯞﻩﺑﻠﯩﻚ ﻛﯧﻠﯩﭗ ﭼﯩﻘﻘـﺎﻥ ﮬﻪﺭﻗﺎﻧـﺪﺍﻕ ﻣﻪﺳـﺌﯘﻟﯩﻴﻪﺗﻨﻰ‬ ‫ﺋﯜﺳﺘﯩﻤﯩﺰﮔﻪ ﺋﺎﻟﻤﺎﻳﻤﯩﺰ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫01‬ ‫ﺋﯩﻜﻜﯩﻨﭽﻰ ﺑﺎﺏ #‪ C‬ﺗﯩﻠﯩﻨﯩﯔ ﺧﯘﺳﯘﺳﯩﻴﻪﺗﻠﯩﺮﻯ‬ ‫ﺗﯩﻠﻐﺎ ﺑﺎﻏﻼﻧﻐﺎﻥ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ)‪ (LINQ‬ﻧﻰ ﺋﯩـﺸﻠﯩﺘﯩﺶ ﺋﯜﭼـﯜﻥ 0.3#‪ C‬ﺩﯨﻜـﻰ ﺑـﺎﺭﻟﯩﻖ ﻳﯧﯖﯩﻠﯩﻘﻼﺭﻧـﻰ‬ ‫ﺋﯩﮕﯩﻠﻪﺵ ﮬﺎﺟﻪﺗﺴﯩﺰ. ﻣﻪﺳﯩﻠﻪﻥ، ﮬﯧﭽﺒﯩﺮ ﻳﯧﯖﯩﻠﯩﻖ »ﺗﯩﻠﻼﺭﻏﺎ ﺋﻮﺭﺗﺎﻕ ﺋﯩﺠﺮﺍ ﺳﯘﭘﯩـﺴﻰ«)‪ (CLR‬ﻧﯩـﯔ‬ ‫ﺋﯚﺯﮔﯩﺮﯨﺸﯩﻨﻰ ﺗﻪﻟﻪﭖ ﻗﯩﻠﻤﺎﻳﺪﯗ. ‪ LINQ‬ﺑﻮﻟﺴﺎ ﻳﯧﯖﻰ ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤﺎﻧﻼﺭ)0.3 #‪ C‬ﻳﺎﻛﻰ ‪Microsoft‬‬ ‫0.9 ‪ (Visual Basic‬ﻏﺎ ﺑﯧﻘﯩﻨﯩﺪﯨﻐﺎﻥ ﺑﻮﻟﯘﭖ، ﺑﯘ ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤـﺎﻧﻼﺭ 0.2‪ Microsoft .NET‬ﺩﯨﻤـﯘ‬ ‫ﻧﻮﺭﻣﺎﻝ ﺋﯩﺸﻠﻪﻳﺪﯨﻐﺎﻥ ﺋﯚﺗﻜﯜﻧﭽﻰ ﻛﻮﺩ ﮬﺎﺳﯩﻞ ﻗﯩﻼﻻﻳﺪﯗ.‬ ‫ﻗﺎﻧـﺪﺍﻗﻼ ﺑﻮﻟﻤﯩـﺴﯘﻥ، ﺑـﯘ ﺑﺎﺑﺘـﺎ #‪ C‬ﺗﯩﻠﯩﻨﯩـﯔ )0.1 #‪ C‬ﺩﯨـﻦ 0.3 #‪ C‬ﻏﯩـﭽﻪ( ﺧﯘﺳﯘﺳـﯩﻴﻪﺗﻠﯩﺮﯨﻨﻰ‬ ‫ﻗﯩﺴﻘﯩﭽﻪ ﺗﻮﻧﯘﺷﺘﯘﺭﯗﭖ ﺋﯚﺗﯜﺵ ﻣﯘﯞﺍﭘﯩﻖ ﺑﯩﻠﯩﻨﺪﻯ. ﺷﯘﻧﺪﯨﻼ #‪ C‬ﺗﯩﻠﻰ ﺋﺎﺳﺎﺳﯩﯖﯩﺰﻧﯩﯔ ﺋﺎﺟﯩﺰ ﺑﻮﻟﯘﺷﻰ‬ ‫ﺳﻪﯞﻩﺑﻠﯩﻚ ‪ LINQ‬ﺑﯩﻠﯩﻤﻠﯩﺮﯨﻨﻰ ﺋﺎﯕﻘﯩﺮﺍﻟﻤﺎﺳﻠﯩﻘﯩﯖﯩﺰﻧﯩﯔ ﺋﺎﻟﺪﯨﻨﻰ ﺋـﺎﻟﻐﯩﻠﻰ ﺑﻮﻟﯘﺷـﻰ ﻣـﯘﻣﻜﯩﻦ. ﺋﻪﮔﻪﺭ‬ ‫ﻣﻪﺯﻛﯘﺭ ﺑﺎﺑﻨﻰ ﺋﺎﺗﻼﭖ ﺋﯚﺗﯜﭖ ﻛﻪﺗـﺴﯩﯖﯩﺰ، ‪ LINQ‬ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩـﺴﯩﻨﯩﯔ ﮬﻪﻗﯩﻘـﻰ ﻣـﺎﮬﯩﻴﯩﺘﯩﻨﻰ ﺑﯩﻠﮕـﯜﯕﯩﺰ‬ ‫ﻛﻪﻟﮕﻪﻧﺪﻩ ﻗﺎﻳﺘﺎ ﻛﯚﺭﯛﭖ ﺑﺎﻗﺎﺭﺳﯩﺰ.‬ ‫0.2 #‪ C‬ﮔﻪ ﻗﺎﻳﺘﺎ ﻧﻪﺯﻩﺭ‬ ‫0.2 #‪ C‬ﺩﻩ ﺋﻪﺳﻠﯩﺪﯨﻜﻰ #‪ C‬ﺗﯩﻠـﻰ ﺋﺎﺳﺎﺳـﯩﺪﺍ ﻛـﯚﭖ ﺋﯩﻠﮕﯩﺮﻟﻪﺷـﻠﻪﺭ ﺑﻮﻟـﺪﻯ. ﻣﻪﺳﯩﻠﻪﻥ،ﻛﯚﭘﻤﺎﺳـﻠﯩﻖ‬ ‫ﺋﯘﻗﯘﻣﯩﻨﯩﯔ ﻗﻮﺷﯘﻟﯘﺷﻰ ﭘﺮﻭﮔﺮﺍﻣﻤﯧﺮﻻﺭﻧﻰ ﺑﯩﺮﺩﯨﻦ ﺋﺎﺭﺗﯘﻕ ﺗﯩﭗ ﭘـﺎﺭﺍﻣﯧﺘﺮﯨﻨﻰ ﺋـﯚﺯ ﺋﯩﭽﯩـﮕﻪ ﺋﺎﻟﻐـﺎﻥ ﺗـﯜﺭ‬ ‫ﯞﻩ ﻣﯧﺘـﻮﺩﻻﺭﻧﻰ ﻳﯧـﺰﯨﺶ ﺋﯩﻤﻜـﺎﻧﯩﻴﯩﺘﯩﮕﻪ ﺋﯩـﮕﻪ ﻗﯩﻠـﺪﻯ. ﺋﻪﻣﻪﻟﯩﻴﻪﺗـﺘﻪ، ﻛﯚﭘﻤـﺎﺱ ﺑﻮﻟـﺴﺎ ‪ LINQ‬ﻧﯩـﯔ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺗﺎﻳﺎﻧﭽﯩﺴﻰ.‬ ‫ﻣﻪﺯﻛﯘﺭ ﭘﺎﺭﺍﮔﺮﺍﻓﺘﺎ، »ﻛﯚﭘﻤﺎﺳـﻠﯩﻖ«، »ﻧﺎﻣـﺴﯩﺰ ﻣﯧﺘـﻮﺩ«) 0.3 #‪ C‬ﺩﯨﻜـﻰ ‪ lambda‬ﺋﯩﭙﺎﺩﯨﻠﯩﺮﯨﻨﯩـﯔ‬ ‫ﺋﺎﺳﺎﺳﻰ (، ‪ yield‬ﺧﺎﺱ ﺳﯚﺯﻯ ﯞﻩ ‪ IEnumerable‬ﺋﯧﻐﯩﺰﻯ ﻗﺎﺗﺎﺭﻟﯩﻖ ‪ LINQ‬ﺋﯜﭼﯜﻥ ﺋﯩﻨﺘﺎﻳﯩﻦ ﻣـﯘﮬﯩﻢ‬ ‫ﺑﻮﻟﻐﺎﻥ 0.2 #‪ C‬ﻧﯩﯔ ﺧﯘﺳﯘﺳﯩﻴﻪﺗﻠﯩﺮﻯ ﺗﻮﻧﯘﺷﺘﯘﺭﯗﻟﺪﻯ. ‪ LINQ‬ﻧـﻰ ﮬﻪﻗﯩﻘﯩـﻲ ﭼﯜﺷـﯜﻧﯜﺵ ﺋﯜﭼـﯜﻥ‬ ‫ﺑﯘ ﺋﯘﻗﯘﻣﻼﺭﻧﻰ ﺑﯩﻠﯩﺶ ﺯﯙﺭﯛﺭﺩﯗﺭ.‬ ‫ﻛﯚﭘﻤﺎﺳﻠﯩﻖ‬ ‫ﻧﯘﺭﻏﯘﻥ ﭘﺮﻭﮔﺮﺍﻣﻤﺎ ﺗﯩﻠﻠﯩﺮﯨﺪﺍ ﺋﯚﺯﮔﻪﺭﮔﯜﭼﻰ ﻣﯩﻘﺪﺍﺭ ﯞﻩ ﺋﻮﺑﻴﯧﻜﺘﻼﺭﻧﻰ ﻛﻮﻧﺘﺮﻭﻝ ﻗﯩﻠﯩـﺶ ﺋﯜﭼـﯜﻥ ﺋﯧﻨﯩـﻖ‬ ‫ﺗﯩﭗ ﯞﻩ ﺗﯩﭙﻼﺭﻧﻰ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺷﻘﺎ ﻛﻪﺳﻜﯩﻦ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻗﺎﺋﯩﺪﯨﻠﯩﺮﻯ ﺑﯧﻜﯩـﺘﯩﻠﮕﻪﻥ. ﺋﻮﻣﯘﻣﻼﺷـﺘﯘﺭﯗﺵ‬ ‫ﻧﯘﻗﺘﯩـــﺴﯩﺪﯨﻦ ﺋﯧﻴﺘﻘﺎﻧـــﺪﺍ، ﻗـــﺎﺗﺘﯩﻖ ﺗﯩﭙﻠﯩـــﻖ ﺗﯩﻠـــﻼﺭﺩﺍ ﻳﯧﺰﯨﻠﻐـــﺎﻥ ﻛـــﻮﺩﻻﺭﺩﺍ ﺑﻪﺯﻯ ﻧﯘﻗـــﺴﺎﻧﻼﺭﻧﯩﯔ‬ ‫ﺳﺎﻗﻼﻧﻐﺎﻧﻠﯩﻘﯩﻨﻰ ﺑﺎﻳﻘﺎﻳﻤﯩﺰ. ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻛﻮﺩﻗﺎ ﻗﺎﺭﺍﻳﻠﻰ:‬ ‫ { ) ‪int Min( int a, int b‬‬ ‫ ;‪    if (a < b) return a‬‬ ‫ ;‪    else return b‬‬ ‫ }‬ ‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﻛﻮﺩﺗﯩﻜﻰ ‪ Min‬ﻣﯧﺘﻮﺩﻯ ﭘﻪﻗﻪﺕ ﺗﯩﭙﻰ ‪ int‬ﺑﻮﻟﻐﺎﻥ ﭘﺎﺭﺍﻣﯧﺘﯩﺮﻻﺭﻏﯩﻼ ﻣﻪﺷﻐﯘﻻﺕ ﺑﯧﺠﯩﺮﻩﻟﻪﻳﺪﯗ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫11‬ ‫ﺋﻪﮔﻪﺭ ﺋﯘﻧﻰ ﺑﺎﺷﻘﺎ ﺗﯩﭙﻠﯩﻖ ﭘﺎﺭﺍﻣﯧﺘﯩﺮﻻﺭﻏﺎ ﻗﻮﻟﻼﻧﻤﺎﻗﭽﻰ ﺑﻮﻟﺴﺎﻕ، ﭼﻮﻗﯘﻡ ﺷﯘ ﺗﯩﭙﻘﺎ ﺧﺎﺱ ﻣﯧﺘﻮﺩ‬ ‫ﺋﻪﻧﺪﯨﺰﯨﺴﯩﻨﻰ ﺗﻪﻣﯩﻨﻠﻪﺷﻜﻪ ﺗﻮﻏﺮﺍ ﻛﯧﻠﯩﺪﯗ، ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫ { ) ‪float Min( float a, float b‬‬ ‫ ;‪    if (a < b) return a‬‬ ‫ ;‪    else return b‬‬ ‫ }‬ ‫‪ object‬ﺗﯩﭙــﻰ ﺑــﺎﺭﻟﯩﻖ ﺗﯩﭙﻼﺭﻧﯩــﯔ ﺋﺎﺗﯩــﺴﻰ ﺑﻮﻟﻐﺎﭼﻘــﺎ، ﺑــﺎﻻ ﺗﯩﭙﻼﺭﻧــﻰ ﺋﯘﻧﯩﯖﻐــﺎ ﺋﺎﻟﻤﺎﺷــﺘﯘﺭﻏﯩﻠﻰ ﯞﻩ‬ ‫ﺋﻪﺳﻠﯩﮕﻪ ﻗﺎﻳﺘﯘﺭﻏﯩﻠﻰ ﺑﻮﻟﯩﺪﯗ، ﺷﯘﯕﺎ ‪ object‬ﺗﯩﭙﯩﻨﻰ ﺋﻮﺭﺗﺎﻕ ﺗﯩﭗ ﻗﯩﻠﯩﭗ ﺋﯩﺸﻠﯩﺘﯩﺸﻜﻪ ﺋﺎﺩﻩﺗﻠﻪﻧﮕﻪﻥ‬ ‫ﭘﺮﻭﮔﺮﺍﻣﻤﯧﺮﻻﺭ ﺑﻪﻟﻜﯩﻢ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻛـﻮﺩ ﻳﯧﺰﯨـﭗ ﻳـﯘﻗﯩﺮﯨﻘﻰ ﺋـﺎﯞﺍﺭﯨﭽﯩﻠﯩﻘﺘﯩﻦ ﻗﯘﺗﯘﻟﻤـﺎﻗﭽﻰ ﺑﻮﻟﯘﺷـﻰ‬ ‫ﻣﯘﻣﻜﯩﻦ:‬ ‫ { ) ‪object Min( object a, object b‬‬ ‫ ;‪    if (a < b) return a‬‬ ‫ ;‪    else return b‬‬ ‫}‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺗﻮﻟﯩﻤـﯘ ﺋﻪﭘـﺴﯘﺱ، ﺋﻮﻣﯘﻣﻼﺷـﻘﺎﻥ ‪ object‬ﺗﯩﭙﯩﻐـﺎ ﻧﯩـﺴﺒﻪﺗﻪﻥ »ﺩﻯ ﻛﯩﭽﯩـﻚ«)<( ﻣﻪﺷﻐﯘﻻﺗﭽﯩـﺴﯩﻨﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ ـ‬ ‫ﺋﯩﺸﻠﯩﺘﯩﺶ ﺋﯜﻧﯜﻣﺴﯩﺰﺩﯗﺭ. ﺷﯘﯕﺎ ﻳﻪﻧﯩﻼ ﺋﻮﺭﺗﺎﻕ ﺋﯧﻐﯩﺰﻧﻰ ﺋﯩﺸﻠﯩﺘﯩﺸﻜﻪ ﺗﻮﻏﺮﺍ ﻛﯧﻠﯩﺪﯗ:‬ ‫ { ) ‪IComparable Min( IComparable a, IComparable b‬‬ ‫ ;‪    if (a.CompareTo( b ) < 0) return a‬‬ ‫ ;‪    else return b‬‬ ‫}‬ ‫ﮔﻪﺭﭼﻪ ﻣﻪﺳﯩﻠﯩﻨﻰ ﺩﻩﻣﺎﻟﻠﯩﻖ ﮬﻪﻝ ﻗﯩﻠﻐﺎﻥ ﺑﻮﻟﺴﺎﻗﻤﯘ، ﻟﯧﻜﯩﻦ ﭼﻮﯓ ﭘﯧﺸﻜﻪﻟﺪﯨﻦ ﺑﯩﺮﻧﻰ ﺗﯧﺮﯨﺪﯗﻕ: ‪Min‬‬ ‫ﻓﯘﻧﻜﺴﯩﻴﯩﺴﻰ ﺋﯩﺠﺮﺍ ﺟﻪﺭﻳﺎﻧﯩﺪﺍ ﺋﯚﺗﻜﯜﻧﭽﻰ ﺗﯩﭗ ﮬﺎﺳﯩﻞ ﻗﯩﻠﯩﭗ ﻗﻮﻳﺪﻯ. ﻳﻪﻧﻰ، ﻣﻪﺳﯩﻠﻪﻥ، ‪ Min‬ﻧـﻰ‬ ‫ﺋﯩﺸﻠﻪﺗﻜﯜﭼﯩﻨﯩﯔ ﺋﯘﻧﯩﯖﻐﺎ ﺋﯩﻜﻜﻰ ﺩﺍﻧﻪ ‪ int‬ﺗﯩﭙﻠﯩﻖ ﭘﯜﺗﯜﻥ ﺳﺎﻥ ﻳﻮﻟﻠﯩﺸﻰ ‪ int‬ﺩﯨﻦ ‪ IComparable‬ﻏـﺎ‬ ‫ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻣﻪﺷﻐﯘﻻﺗﯩﻨﻰ ﻛﻪﻟﺘﯜﺭﯛﭖ ﭼﯩﻘﯩﺮﯨـﺪﯗ، ﻟـﯧﻜﯩﻦ ﺑـﯘ ﺟﻪﺭﻳـﺎﻥ ﺋﯧـﻨﯩﻘﻼ ﺋـﺎﺭﺗﯘﻗﺘﯩﻦ-ﺋـﺎﺭﺗﯘﻕ‬ ‫‪ CPU‬ﭼﯩﻘﯩﻤﻰ ﺗﻪﻟﻪﭖ ﻗﯩﻠﯩﺪﯗ. ﮬﻪﺗﺘﺎ ﺑﻪﺯﯨﺪﻩ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ)‪ (Exception‬ﭼﯩﻘﯩﺮﯨﺸﯩﻤﯘ ﻣﯘﻣﻜﯩﻦ.‬ ‫ ;01 = ‪int a = 5, b‬‬ ‫ ;) ‪int c = (int) Min( a, b‬‬ ‫0.2 #‪ C‬ﺩﺍ ﺑﯘ ﻣﻪﺳﯩﻠﻪ ﻛﯚﭘﻤﺎﺳﻠﯩﻖ ﺋﺎﺭﻗﯩﻠﯩﻖ ﮬﻪﻝ ﻗﯩﻠﯩﻨﺪﻯ. ﻛﯚﭘﻤﺎﺳﻠﯩﻘﻨﯩﯔ ﺋﺎﺳﺎﺳـﻰ ﭘﯩﺮﯨﻨـﺴﯩﭙﻰ‬ ‫ﺷﯘﻛﻰ، #‪ C‬ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤﺎﻧﯩﻨﯩﯔ ﺗﯩﭗ ﺭﻩﺗﻠﻪﺵ ﺧﯩﺰﻣﯩﺘﻰ ﮬﺎﺯﯨﺮ-ﺟﺎﯞﺍﺏ ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤﺎﻧﻐﺎ ﺋﯚﺗﻜﯜﺯﯛﭖ‬ ‫ﺑﯧﺮﯨﻠﺪﻯ. ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺴﻰ ‪ Min‬ﻓﯘﻧﻜﯩﺴﯩﻴﯩﺴﯩﻨﯩﯔ ﻛﯚﭘﻤﺎﺱ ﻧﯘﺳﺨﯩﺴﻰ:‬ ‫ { >‪T Min( T a, T b ) where T : IComparable( a, b‬‬ ‫ﺩﻩﻙ ﻳﺎﺯﺍﻻﻳﻤﯩﺰ.‬ ‫ﺋﻪﻣــﺪﻯ، ﺑــﯘﺭﯗﻥ ﺗﯩــﭗ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺷــﻘﺎ ﺳــﻪﺭﭖ ﻗﯩﻠﯩــﭗ ﻳــﯜﺭﮔﻪﻥ ‪ CPU‬ﭼﯩﻘﯩﻤﻠﯩﺮﯨﻤﯩــﺰ ﺗﯧﺠﯩﻠﯩــﭗ،‬ ‫ﭘﺮﻭﮔﺮﺍﻣﻤﯩﻤﯩــﺰ ﺗﯧﺨﯩﻤــﯘ ﺗﯧــﺰ ﺋﯩﺠــﺮﺍ ﺑﻮﻟﯩــﺪﯨﻐﺎﻥ ﺑﻮﻟﺪﯨــﺪﻩ.... ﭼــﯜﻧﻜﻰ ﺑــﯘ ﻳﻪﺭﺩﻩ ﮬﯧﭽﻘﺎﻧــﺪﺍﻕ ﺗﯩ ـﭗ‬ ‫ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻣﻪﺷﻐﯘﻻﺗﻰ ﻳﯜﺯ ﺑﻪﺭﻣﻪﻳﺪﯗ. ﺋﯘﻧﯩﯔ ﺋﯜﺳﺘﯩﮕﻪ ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤـﺎﻥ ﺑﯧـﺮﯨﻠﮕﻪﻥ ﭘﺎﺭﺍﻣﯧﺘﯩﺮﻧﯩـﯔ‬ ‫ﻗﯩﻤﻤﯩﺘﯩﮕﻪ ﺋﺎﺳﺎﺳﻪﻥ ﻛﯚﭘﻤﺎﺱ ﺗﯩﭗ ‪ T‬ﻧﯩﯔ ﺋﯧﻨﯩﻖ ﺗﯩﭙﯩﻨﻰ ﭘﻪﺭﻩﺯ ﻗﯩﻼﻻﻳﺪﯗ)ﺗﯩﭗ ﻛﻪﻟﺘﯜﺭﯛﻟﻤﯩـﺴﻰ ﺩﻩﭖ‬ ‫ﺋﺎﺗﯩﻠﯩﺪﯗ(. ﺷﯘﯕﺎ ﻳﯘﻗﯩﺮﯨﻘﻰ ﻛﻮﺩﻧﻰ ﺗﯧﺨﯩﻤﯘ ﺋﺎﺩﺩﯨﻴﻼﺷﺘﯘﺭﯗﭖ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻛﻤﯘ ﻳﺎﺯﺍﻻﻳﻤﯩﺰ:‬ ‫ ;01 = ‪int a = 5, b‬‬ ‫ ;) ‪int c = Min( a, b‬‬ ‫ﺗﯩﭗ ﻛﻪﻟﺘﯜﺭﯛﻟﻤﯩﺴﻰ: ﺗﯩﭗ ﻛﻪﻟﺘﯜﺭﯛﻟﻤﯩﺴﻰ ﺋﯩﻨﺘﺎﻳﯩﻦ ﻣﯘﮬﯩﻢ ﺋﯩﻘﺘﯩﺪﺍﺭ ﺑﻮﻟﯘﭖ، ﺋﯘ ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤـﺎﻧﻨﻰ‬ ‫ﺗﯩﭙﻘﺎ ﺋﺎﻻﻗﯩﺪﺍﺭ ﺗﻪﭘﺴﯩﻠﯩﻲ ﺋﯩﺸﻼﺭﻏﺎ ﺑﯘﻳﺮﯗﭖ، ﺳﯩﺰﻧﻰ ﺗﯧﺨﯩﻤﯘ ﺋﺎﺑﺴﺘﺮﺍﻛﺖ ﻛﻮﺩ ﻳﯧﺰﯨﺶ ﺋﯩﻤﻜـﺎﻧﯩﻴﯩﺘﯩﮕﻪ‬ ‫ﺋﯩﮕﻪ ﻗﯩﻠﯩﺪﯗ.‬ ‫ﻛﯚﭘﻤﺎﺳــﻠﯩﻘﺘﯩﻦ ﭘﺎﻳــﺪﯨﻠﯩﻨﯩﭗ ﻛﯚﭘﻤــﺎﺱ ﻣﯧﺘــﻮﺩ ﺋﯧــﻨﯩﻘﻠﯩﻐﯩﻠﯩﻼ ﺑﻮﻟــﯘﭖ ﻗﺎﻟﻤــﺎﻱ، ﻳﻪﻧﻪ ﻛﯚﭘﻤــﺎﺱ ﺗــﯜﺭ،‬ ‫ﺋﯧﻐﯩﺰﻻﺭﻧﯩﻤــﯘ ﺋﯧﻨﯩﻘﻠﯩﻐﯩﻠــﻰ ﺑﻮﻟﯩــﺪﯗ. ﻛﯚﭘﻤﺎﺳــﻠﯩﻖ ﺋﯜﺳــﺘﯩﺪﻩ ﺗــﻮﺧﺘﯩﻠﯩﺶ ﺑــﯘ ﻛﯩﺘﺎﺑﻨﯩــﯔ ﺋﺎﺳﺎﺳــﻠﯩﻖ‬ ‫ﻣﻪﻗﺴﯩﺘﻰ ﺑﻮﻟﻤﯩﻐﺎﭼﻘﺎ ﺗﻪﭘـﺴﯩﻠﯩﻲ ﺗﻮﺧﺘﺎﻟﻤـﺎﻱ. ﻟـﯧﻜﯩﻦ ﻳﻪﻧﻪ، ﺷـﯘﻧﯩﻤﯘ ﺩﯦﮕـﯜﻡ ﻛﻪﻟـﺪﻯ: ﻛﯚﭘﻤﺎﺳـﻠﯩﻘﻨﻰ‬ ‫ﭼﯜﺷﻪﻧﻤﻪﻱ ﺗﯘﺭﯗﭖ ‪ LINQ‬ﻛﯚﺭﺳﯩﯖﯩﺰ ﺋﯚﺯﯨﯖﯩﺰﻧﻰ ﺭﺍﮬﻪﺕ ﮬﯧﺲ ﻗﯩﻼﻟﻤﺎﻳﺴﯩﺰ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫31‬ ‫ﻣﯘﯞﻩﻗﻘﻪﺗﻠﻪﺭ‬ ‫ﻣﯘﯞﻩﻗﻘﻪﺕ ﺩﯦﮕﯩﻨﯩﻤﯩـﺰ ﺑﯩـﺮ ﻳـﺎﻛﻰ ﺑﯩـﺮﺩﯨﻦ ﺋـﺎﺭﺗﯘﻕ ﻣﯧﺘﻮﺩﻧﯩـﯔ ﻗﺎﭘﻼﻧﻤـﺎ ﺗﯜﺭﯨـﺪﯨﻦ ﺋﯩﺒـﺎﺭﻩﺕ. ﺋﯩﭽﻜـﻰ‬ ‫ﻗﯩـﺴﯩﻤﺪﺍ، ﺑﯩ ـﺮ ﺩﺍﻧﻪ ﻣـﯘﯞﻩﻗﻘﻪﺗﺘﻪ ﻣﯘﺷ ـﯘ ﻣـﯘﯞﻩﻗﻘﻪﺕ ﻗﺎﭘﻠﯩﻐ ـﺎﻥ ﻣﯧﺘﻮﺩﻻﺭﻏـﺎ ﻗﺎﺭﯨﺘﯩﻠﻐ ـﺎﻥ ﺋﯩ ـﺴﺘﺮﯦﻠﻜﯩﻼﺭ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺗﯩﺰﻣﯩﺴﻰ ﺳﺎﻗﻠﯩﻨﯩﺪﯗ. ﮬﻪﺭ ﺑﯩﺮ ﺋﯩﺴﺘﺮﯦﻠﻜﺎ ﺋﯚﺯﻯ ﺗﻮﻏﯘﺭﻻﻧﻐﺎﻥ ﻣﯧﺘﻮﺩﻧﻰ ﺋـﯚﺯ ﺋﯩﭽﯩـﮕﻪ ﺋﺎﻟﻐـﺎﻥ ﺗﯜﺭﯨﻨﯩـﯔ‬ ‫ﭼﺎﻗﯩﺮﯨﻠﻤﯩﺴﯩﻐﺎ ﻣﺎﺱ ﻛﯧﻠﯩﺪﯗ.‬ ‫ﮬﻪﺭﺑﯩﺮ ﻣﯘﯞﻩﻗﻘﻪﺕ ﺑﯩﺮ-ﻗﺎﻧﭽﻪ ﻣﯧﺘـﻮﺩﻧﻰ ﻗﺎﭘﻠﯩﻴﺎﻻﻳـﺪﯗ. ﻟـﯧﻜﯩﻦ ﺑـﯘ ﭘﺎﺭﺍﮔﺮﺍﻓﺘـﺎ ﭘﻪﻗﻪﺕ ﺑﯩـﺮﻻ ﻣﯧﺘـﻮﺩﻧﻰ‬ ‫ﻗﺎﭘﻠﯩﻐﺎﻥ ﻣـﯘﯞﻩﻗﻘﻪﺗﻠﻪﺭ ﻛـﯚﭘﺮﻩﻙ ﻛﯚﯕـﯜﻝ ﺑﯚﻟﯩﻨﯩـﺪﯗ. ﺋﺎﺑـﺴﺘﺮﺍﻛﺘﺮﺍﻕ ﻧﯘﻗﺘﯩـﺪﯨﻦ ﺋﯧﻠﯩـﭗ ﺋﯧﻴﺘـﺴﺎﻕ، ﺑـﯘ‬ ‫ﺧﯩﻠ ـﺪﯨﻜﻰ ﻣ ـﯘﯞﻩﻗﻘﻪﺗﻠﻪﺭﻧﻰ »ﻛ ـﻮﺩ ﻗ ـﺎﭘﭽﯘﻗﻰ« ﻏ ـﺎ ﺋﻮﺧ ـﺸﯩﺘﯩﺶ ﻣ ـﯘﻣﻜﯩﻦ. ﺑ ـﯘ ﻗ ـﺎﭘﭽﯘﻗﺘﯩﻜﻰ ﻛ ـﻮﺩﻧﻰ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﯚﺯﮔﻪﺭﺗﻜﯩﻠﻰ ﺑﻮﻟﻤﺎﻳﺪﯗ. ﻟﯧﻜﯩﻦ ﺋﯘ ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺩﻩﺳـﺘﯩﻠﯩﺮﯨﮕﻪ ﺋﻪﮔﯩـﺸﯩﭗ ﻳﯚﺗﻜﯩﻠﻪﻟﻪﻳـﺪﯗ ﮬﻪﻣـﺪﻩ ﺗـﺎﻛﻰ‬ ‫ﺋــﯘﻧﻰ ﺋﯩــﺸﻠﯩﺘﯩﺶ ﺋﯧﮫﺘﯩﻴــﺎﺟﻰ ﻗﺎﻟﻤﯩﻐﺎﻧﻐــﺎ ﻗﻪﺩﻩﺭ ﻣﻪﯞﺟــﯘﺕ ﺑﻮﻟــﯘﭖ ﺗﯘﺭﺍﻻﻳــﺪﯗ. ﺋﯘﻧﯩﯖــﺪﯨﻦ ﺑﺎﺷــﻘﺎ،‬ ‫ﻣﯘﯞﻩﻗﻘﻪﺕ ﻳﻪﻧﻪ، ﺋﯚﺯﻯ ﻗﺎﭘﻠﯩﻐـﺎﻥ ﻣﯧﺘـﻮﺩﻧﻰ ﺋـﯚﺯ ﺋﯩﭽﯩـﮕﻪ ﺋﺎﻟﻐـﺎﻥ ﺗـﯜﺭﻧﻰ ﮬـﯧﭻ ﺑﻮﻟﻤﯩﻐﺎﻧـﺪﺍ ﺋﯚﺯﯨﻨﯩـﯔ‬ ‫ﺋﯚﻣﺮﻯ ﺑﯩﻠﻪﻥ ﺗﻪﯓ ﻳﺎﺷﯩﻐﯘﺯﺍﻻﻳﺪﯗ.‬ ‫ﻧﺎﻣﺴﯩﺰ ﻣﯧﺘﻮﺩ ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ ﻣﯘﯞﻩﻗﻘﻪﺗﻨﯩﯔ ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩﺴﯩﻐﺎ ﺋﺎﺳﺎﺳﻪﻥ ﺋﯚﺯﮔﻪﺭﺗﯩﻠﯩﭗ ﻗﯘﺭﯗﻟﻐﺎﻥ. ﺋﯘﻧﯩﯖﻐـﺎ‬ ‫ﺋﺎﺋﯩﺖ ﻣﻪﺯﻣﯘﻧﻼﺭ ﻛﯧﻴﯩﻨﻜﻰ ﭘﺎﺭﺍﮔﺮﺍﻓﺘـﺎ ﺳـﯚﺯﻟﯩﻨﯩﺪﯗ. ﻣـﯘﯞﻩﻗﻘﻪﺗﺘﯩﻦ ﺑﯩﺮﻧـﻰ ﺋﯧـﻨﯩﻘﻼﺵ ﺋﻪﻣﻪﻟﯩﻴﻪﺗـﺘﻪ ﺷـﯘ‬ ‫ﻣﯘﯞﻩﻗﻘﻪﺗﻨﯩﯔ ﺋﯚﺯﯨﻨﻰ ﻗﯘﺭﯨﺪﯨﻐﺎﻥ ﺗﯩﭙﺘﯩﻦ ﺑﯩﺮﻧﻰ ﺋﯧـﻨﯩﻘﻼﺵ ﺑﯩـﻠﻪﻥ ﺑـﺎﺭﺍﯞﻩﺭ. ﻣـﯘﯞﻩﻗﻘﻪﺕ ﺋﯧﻨﯩﻘﻠﯩﻐﺎﻧـﺪﺍ‬ ‫ﭼﻮﻗــﯘﻡ ﺋﯘﻧﯩــﯔ ﻣﯧﺘــﻮﺩ ﺋﻪﻧﺪﯨﺰﯨــﺴﯩﻨﻰ ﺗﻮﻟــﯘﻕ ﺗﻪﻣﯩﻨﻠﯩــﺸﻰ ﻛﯧــﺮﻩﻙ. ﻛــﻮﺩ 1.2 ﺩﺍ ﺋــﯜﭺ ﺧﯩــﻞ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﻮﺧﺸﯩﻤﺎﻳﺪﯨﻐﺎﻥ ﻣﯘﯞﻩﻗﻘﻪﺗﻨﯩﯔ ﺋﯧﻨﯩﻘﻠﯩﻤﯩﺴﻰ ﺑﯧﺮﯨﻠﺪﻯ. ﺋﯘﻻﺭ ﺋﯚﺯﻟﯩﺮﻯ ﺑﯩﻠﻪﻥ ﺋﻮﺧﺸﺎﺵ ﺋﻪﻧﺪﯨﺰﯨﺪﯨﻜﻰ‬ ‫ﻣﯧﺘﻮﺩﻻﺭﻧﻰ ﻗﺎﭘﻠﯩﻴﺎﻻﻳﺪﯗ.‬ ‫ﻛﻮﺩ 1.2‬ ‫ ;)(‪delegate void SimpleDelegate‬‬ ‫ ;)(‪delegate int ReturnValueDelegate‬‬ ‫ ;) ‪delegate void TwoParamsDelegate( string name, int age‬‬ ‫ﻣﯘﯞﻩﻗﻘﻪﺕ ﺑﯘﺭﯗﻧﻘﻰ ‪ C‬ﺗﯩﻠﯩﺪﯨﻜﻰ ﻓﯘﻧﻜﯩﺴﯩﻴﻪ ﺋﯩﺴﺘﺮﯦﻠﻜﯩﺴﯩﻐﺎ ﻗﺎﺭﯨﻐﺎﻧﺪﺍ ﺗﯧﺨﯩﻤﯘ ﻗﯧﻠﯩﭙﻼﺷﻘﺎﻥ، ﺗﯧﺨﯩﻤﯘ‬ ‫ﺑﯩﺨﻪﺗﻪﺭ. ‪ C# 1.x‬ﺩﻩ ﺋﺎﺷﻜﺎﺭﻩ ﻳﻮﺳﯘﻧﺪﺍ ﺋﻮﺑﻴﯧﻜﺖ ﻗـﯘﺭﯗﺵ ﺋﯘﺳـﯘﻟﻰ ﺋـﺎﺭﻗﯩﻠﯩﻘﻼ ﻣـﯘﯞﻩﻗﻘﻪﺕ ﻗـﯘﺭﻏﯩﻠﻰ‬ ‫ﺑﻮﻻﺗﺘﻰ. ﻣﻪﺳﯩﻠﻪﻥ ﻛﻮﺩ 2.2 ﺩﺍ ﻛﯚﺭﺳﯩﺘﯩﻠﮕﻪﻧﺪﻩﻙ:‬ ‫ﻛﻮﺩ 2.2‬ ‫ { ‪public class DemoDelegate‬‬ ‫ } … { )(‪    void MethodA‬‬ ‫ } … { )(‪    int MethodB‬‬ ‫ } … { ) ‪    void MethodC( string x, int y‬‬ ‫ ‬ ‫ { )(‪    void CreateInstance‬‬ ‫ ;) ‪        SimpleDelegate a = new SimpleDelegate( MethodA‬‬ ‫ (  ‪        ReturnValueDelegate  b  =  new  ReturnValueDelegate‬‬ ‫ ;) ‪MethodB‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫41‬ ‫ ;) ‪        TwoParamsDelegate c = new TwoParamsDelegate( MethodC‬‬ ‫ }    ‬ ‫ }‬ ‫‪ C# 1.x‬ﺩﯨﻜﻰ ﻣﯘﯞﻩﻗﻘﻪﺕ ﺋﯧﻨﯩﻘﻼﺵ ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩﺴﯩﺪﺍ ﻧﻮﻗﺴﺎﻥ ﺑﺎﺭﻟﯩﻘﯩﻨﻰ ﺑﺎﻳﻘﯩـﺪﯨﯖﯩﺰﻣﯘ؟. ﻗﺎﺋﯩﺪﯨـﺴﻰ‬ ‫ﺑﻮﻳﯩﭽﻪ ﻧﯩـﺸﺎﻥ ﻣﯧﺘﻮﺩﯨﻨﯩـﯔ ﺋﻪﻧﺪﯨﺰﯨـﺴﻰ ﻣـﯘﯞﻩﻗﻘﻪﺕ ﺋﻪﻧﺪﯨﺰﯨـﺴﻰ ﺑﯩـﻠﻪﻥ ﺑﯩـﺮﺩﻩﻙ ﺑﻮﻟﯘﺷـﻰ ﻛﯧـﺮﻩﻙ.‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﯘﻧـﺪﺍﻕ ﺑﻮﻟﻤﯩﻐﺎﻧـﺪﺍ ﻛـﻮﺩ- ﺗﻪﺭﺟﯩﻤﯩـﺪﯨﻦ ﺋﯚﺗﻤﻪﻳـﺪﯗ. ﺷـﯘﻧﺪﺍﻕ ﺗﯘﺭﯗﻗﻠـﯘﻕ ﻳﻪﻧﻪ ﻧـﯧﻤﻪ ﺋﯜﭼـﯜﻥ ‪new‬‬ ‫ﺧﺎﺱ ﺳـﯚﺯﯨﻨﻰ ﺋﯩـﺸﻠﯩﺘﯩﻤﯩﺰ، ﺋـﯘﻧﻰ ﺋﯩـﺸﻠﯩﺘﯩﺶ ﺋﯧـﻨﯩﻘﻼ ﺑﯩـﺰﺩﯨﻦ ﻣـﯘﯞﻩﻗﻘﻪﺕ ﺋﯩـﺴﻤﯩﻨﻰ ﺑﯩﻠﯩـﺸﯩﻤﯩﺰﻧﻰ‬ ‫ﺗﻪﻟﻪﭖ ﻗﯩﻠﯩﺪﯗ. ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ ﻣﯘﯞﻩﻗﻘﻪﺕ ﺗﯩﭙﯩﻨﻰ ﻛﻮﺩﻧﯩﯔ ﺑﺎﺵ-ﺋﺎﺧﯩﺮﯨﻨﻰ ﺗﻪﮬﻠﯩﻞ ﻗﯩﻠﯩﺶ ﺋـﺎﺭﻗﯩﻠﯩﻘﻤﯘ‬ ‫ﻛﻪﻟﺘﯜﺭﯛﭖ ﭼﯩﻘﯩﺮﯨﯟﺍﻟﻐﯩﻠﻰ ﺑﻮﻟﯩﺪﯗ)ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤﺎﻥ ﺷﯘﻧﺪﺍﻕ ﻗﯩﻠﯩﺸﻰ ﻛﯧﺮﻩﻙ ﺋﯩﺪﻯ(.‬ ‫0.2 #‪ C‬ﺩﻩ ﺑﯘ ﻣﻪﺳﯩﻠﻪ ﺑﺎﻳﻘﯩﻠﯩﭗ ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩﺴﻰ ﺗﯧﺨﯩﻤﯘ ﺋﺎﺩﺩﯨﻴﻼﺷﺘﯘﺭﯗﻟﺪﻯ. ﺋﺎﻟﺪﯨﻨﻘﻰ ﻣﯩﺴﺎﻝ ﻛﻮﺩﺗﺎ‬ ‫ﻗﯘﺭﻏ ـﺎﻥ ﻣ ـﯘﯞﻩﻗﻘﻪﺕ ﺋ ـﻮﺑﻴﯧﻜﺘﯩﻨﻰ ﺋﻪﻣ ـﺪﻯ ‪ new‬ﺧ ـﺎﺱ ﺳ ـﯚﺯﯨﻨﻰ ﺋﯩ ـﺸﻠﻪﺗﻤﻪﻱ ﺗﯘﺭﯗﭘﻤ ـﯘ ﻗﯘﺭﺍﻻﻳ ـﺪﯨﻐﺎﻥ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﻮﻟﺪﯗﻕ. ﭘﻪﻗﻪﺕ ﻣﯧﺘﻮﺩ ﻧـﺎﻣﯩﻨﻰ ﻳـﻮﻟﻼﭖ ﺑﻪﺭﺳـﻪﻛﻼ ﺑﻮﻟﯩـﺪﯗ. ﻛـﻮﺩ-ﺗﻪﺭﺟﯩﻤـﺎﻥ ﻣﯧﺘـﻮﺩ ﺋﻪﻧﺪﯨﺰﯨـﺴﯩﮕﻪ‬ ‫ﺋﺎﺳﺎﺳﻪﻥ ﻣﯘﯞﻩﻗﻘﻪﺕ ﺗﯩﭙﯩﻨﻰ ﻛﻪﻟﺘﯜﺭﯛﭖ ﭼﯩﻘﯩﺮﯨﭗ، ‪ new‬ﺧـﺎﺱ ﺳـﯚﺯﯨﻨﻰ ﻛـﻮﺩ-ﺗﻪﺭﺟﯩـﻤﻪ ﺟﻪﺭﻳﺎﻧﯩـﺪﺍ‬ ‫ﺋﺎﭘﺘﻮﻣﺎﺗﯩﻚ ﻗﻮﺷﯩﺪﯗ. ﻣﻪﺳﯩﻠﻪﻥ، ﻛﻮﺩ 3.2 ﺩﯨﻜﻰ 0.2 #‪ C‬ﻛﻮﺩﻯ ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤﻪ ﻗﯩﻠﯩﻨﯩﺶ ﺋﺎﺭﻗﯩﻠﯩﻖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﮬﺎﺳـﯩﻞ ﺑﻮﻟﻐـﺎﻥ ‪ IL‬ﻛـﻮﺩﻯ، ‪ C# 1.x‬ﻧﯩـﯔ ﻣﯩـﺴﺎﻝ ﻛﻮﺩﯨـﺪﺍ ﮬﺎﺳـﯩﻞ ﻗﯩﻠﯩﻨﻐﯩﻨـﻰ ﺑﯩـﻠﻪﻥ ﺋﻮﭘﻤـﯘ-‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﻮﺧﺸﺎﺵ.‬ ‫ﻛﻮﺩ 3.2‬ ‫ { ‪public class DemoDelegate‬‬ ‫ } … { )(‪    void MethodA‬‬ ‫ } … { )(‪    int MethodB‬‬ ‫ } … { ) ‪    void MethodC( string x, int y‬‬ ‫ ‬ ‫ { )(‪    void CreateInstance‬‬ ‫ ;‪        SimpleDelegate a = MethodA‬‬ ‫ ;‪        ReturnValueDelegate b = MethodB‬‬ ‫ ;‪        TwoParamsDelegate c = MethodC‬‬ ‫ … //        ‬ ‫ }    ‬ ‫ … //    ‬ ‫ }‬ ‫ﮬﻪﺗﺘﺎ ﻛﯚﭘﻤﺎﺱ ﻣﯘﯞﻩﻗﻘﻪﺗﻤﯘ ﺋﯧﻨﯩﻘﻠﯩﻴﺎﻻﻳـﺴﯩﺰ. ﺑـﯘ، ﻛﯚﭘﻤـﺎﺱ ﺗﯜﺭﻧﯩـﯔ ﺋﯩﭽﯩـﺪﻩ ﻣـﯘﯞﻩﻗﻘﻪﺕ ﺋﯧﻨﯩﻘﻼﺷـﺘﺎ‬ ‫ﺑﻪﻛﻼ ﺋﻪﺳﻘﺎﺗﯩﺪﯗ. ﺋﯘﻧﯩﯔ ﺋﯜﺳﺘﯩﮕﻪ ﻛﯚﭘﻤﺎﺱ ﻣﯘﯞﻩﻗﻘﻪﺕ ‪ LINQ‬ﺩﺍ ﺋﯩﻨﺘﺎﻳﯩﻦ ﻣﯘﮬﯩﻢ ﺋﻮﺭﯗﻥ ﺗﯘﺗﯩﺪﯗ.‬ ‫ﻣﻪﯞﺟــﯘﺕ ﻣﯧﺘﻮﺩﻧﯩــﯔ ﺋﯩﭽﯩــﮕﻪ ﮬﻪﺭﻛﻪﺗﭽــﺎﻥ ﮬــﺎﻟﻪﺗﺘﻪ ﻛــﻮﺩ ﻗﯩــﺴﺘﯘﺭﯗﺵ ﺑﻮﻟــﺴﺎ ﻣﯘﯞﻩﻗﻘﻪﺗﻨﯩــﯔ ﺋﻪﯓ‬ ‫ﺋﻮﻣﯘﻣﻼﺷﻘﺎﻥ ﻗﻮﻟﻠﯩﻨﯩﺸﯩﺪﯗﺭ. ﻛﻮﺩ 4.2 ﺩﺍ ‪ Repeat10Times‬ﺑﻮﻟﺴﺎ ﺋﯚﺯﮔﻪﺭﺗﻜﯜﻣﯩﺰ ﻳﻮﻕ ﻣﯧﺘﻮﺩ:‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫51‬ ‫ﻛﻮﺩ 4.2‬ ‫ { ‪public class Writer‬‬ ‫ ;‪    public string Text‬‬ ‫ ;‪    public int Counter‬‬ ‫ { )(‪    public void Dump‬‬ ‫ ;) ‪        Console.WriteLine( Text‬‬ ‫ ;++‪        Counter‬‬ ‫ }    ‬ ‫ }‬ ‫ ‬ ‫ { ‪public class DemoDelegate‬‬ ‫ { ) ‪    void Repeat10Times( SimpleDelegate someWork‬‬ ‫ ;)(‪        for (int i = 0; i < 10; i++) someWork‬‬ ‫ }    ‬ ‫ ‬ ‫ { )(1‪    void Run‬‬ ‫ ;)(‪        Writer writer = new Writer‬‬ ‫ ;"‪        writer.Text = "C# chapter‬‬ ‫ ;) ‪        this.Repeat10Times( writer.Dump‬‬ ‫ ;) ‪        Console.WriteLine( writer.Counter‬‬ ‫ }    ‬ ‫ … //    ‬ ‫ }‬ ‫ﻧــﯚﯞﻩﺗﺘﻪ ‪ SimpleDlegate‬ﺗﯩﭙﻠﯩــﻖ ﭼــﺎﻗﯩﺮﻏﯘ ﻣﻪﯞﺟــﯘﺕ)‪ simpleWork‬ﺷــﯘ(، ﺑﯩــﺮﺍﻕ ﺑﯩﺰﻧﯩــﯔ‬ ‫ﻣﻪﻗــﺴﯩﺘﯩﻤﯩﺰ ﻗﯩــﺴﺘﯘﺭﯗﻟﻐﺎﻥ ﻣﯧﺘﻮﺩﻗــﺎ ﮬﻪﺭﭖ-ﺑﻪﻟــﮕﻪ ﺗﯩﺰﻣﯩــﺴﻰ ﻳــﻮﻟﻼﭖ ﺑﯧــﺮﯨﺶ ﯞﻩ ﻗﯩــﺴﺘﯘﺭﯗﻟﻐﺎﻥ‬ ‫ﻣﯧﺘﻮﺩﻧﯩﯔ ﻗﺎﻧﭽﻪ ﻗﯧﺘﯩﻢ ﺋﯩﺠﺮﺍ ﺑﻮﻟﻐﺎﻧﻠﯩﻘﯩﻨﻰ ﺳﺎﻧﺎﺵ. ﺷﯘﯕﺎ، ‪ Dump‬ﻣﯧﺘﻮﺩﻯ ﺋﯜﭼﯜﻥ ﺋﯘﭼﯘﺭ ﺗﻪﻣﯩﻨﻠﻪﭖ‬ ‫ﺑﯧﺮﯨﺪﯨﻐﺎﻥ ‪ Writer‬ﺗﯜﺭﯨﻨﻰ ﻗﯘﺭﯗﯞﺍﻟﺪﯗﻕ. ﺩﯦﻤﻪﻙ، ﻛﻮﺩ ﻗﯩﺴﺘﯘﺭﯗﺵ ﺋﯜﭼﯜﻥ ﺋﯩﻜﻜـﻰ ﺗـﯜﺭ ﺋﯧﻨﯩﻘﻼﺷـﻘﺎ‬ ‫ﺗﻮﻏﺮﺍ ﻛﻪﻟﺪﻯ. ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ ﺑﯘ ﺧﯩـﻞ ﺋﯘﺳـﯘﻟﻨﻰ ﻧﺎﻣـﺴﯩﺰ ﻣﯧﺘـﻮﺩ ﺋـﺎﺭﻗﯩﻠﯩﻖ ﺗﯧﺨﯩﻤـﯘ ﺋﺎﺩﺩﯨﻴﻼﺷـﺘﯘﺭﻏﯩﻠﻰ‬ ‫ﺑﻮﻟﯩﺪﯗ.‬ ‫ﻧﺎﻣﺴﯩﺰ ﻣﯧﺘﻮﺩ‬ ‫ﺋﺎﻟﺪﯨﻨﻘﻰ ﺑﯚﻟﻪﻛﺘﻪ، ﻣﯘﯞﻩﻗﻘﻪﺗﻨﯩﯔ ﺩﺍﺋﯩﻤﻠﯩﻖ ﺋﯩـﺸﻠﯩﺘﯩﺶ ﺋﯘﺳـﯘﻟﻰ ﺋﯜﺳـﺘﯩﺪﻩ ﺗﻮﺧﺘﺎﻟـﺪﯗﻕ. 0.2 #‪ C‬ﺩﻩ‬ ‫ﻧﺎﻣﺴﯩﺰ ﻣﯧﺘﻮﺩﻻﺭﻧﻰ ﻗﻮﻟﻠﯩﻨﯩﺶ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻛـﻮﺩ 4.2 ﺩﯨﻜﯩـﺪﻩﻙ ﻛـﻮﺩﻻﺭﻧﻰ ﻳﯧﺰﯨـﺸﻨﯩﯔ ﺗﯧﺨﯩﻤـﯘ ﺋـﺎﺩﺩﯨﻲ‬ ‫ﻳﻮﻟﻠﯩﺮﻯ ﺗﻪﻣﯩﻨﻠﻪﻧﮕﻪﻥ. ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫61‬ ‫ﻛﻮﺩ 5.2‬ ‫ { ‪public class DemoDelegate‬‬ ‫ { ) ‪    void Repeat10Times( SimpleDelegate someWork‬‬ ‫ ;)(‪        for (int i = 0; i < 10; i++) someWork‬‬ ‫ }    ‬ ‫ ‬ ‫ { )(2‪    void Run‬‬ ‫ ;0 = ‪        int counter‬‬ ‫ { ‪        this.Repeat10Times( delegate‬‬ ‫ ;) "‪            Console.WriteLine( "C# chapter‬‬ ‫ ;++‪            counter‬‬ ‫ ;) }        ‬ ‫ ;) ‪        Console.WriteLine( counter‬‬ ‫ }    ‬ ‫ … //    ‬ ‫ }‬ ‫ﺑﯘ ﻛﻮﺩﺩﺍ ‪ Writer‬ﺗـﯜﺭﯨﻨﻰ ﺋﯩﺸﻠﯩﺘﯩـﺸﻨﯩﯔ ﮬـﺎﺟﯩﺘﻰ ﺑﻮﻟﻤﯩـﺪﻯ. ﭼـﯜﻧﻜﻰ ﻛـﻮﺩ-ﺗﻪﺭﺟﯩﻤـﺎﻥ ‪Writer‬‬ ‫ﺗﯜﺭﯨﻨﯩﯔ ﺭﻭﻟﯩﻨﻰ ﺋﯚﺗﻪﻳﺪﯨﻐﺎﻥ ﻧﺎﻣﺴﯩﺰ ﺗﯜﺭﻧﻰ ﻳﯘﺷﯘﺭﯗﻥ ﻗﯘﺭﯗﭖ، ﺋﯩـﺸﻼﺭﻧﻰ ﺋـﯚﺯ ﻳﻮﻟﯩـﺪﺍ ﻣﺎﯕﻐﯘﺯﺍﻻﻳـﺪﯗ.‬ ‫ﺋﻪﻣﻪﻟﯩﻴﻪﺗــﺘﻪ، ﺑﯩــﺰ ‪ Repeat10Times‬ﻧــﻰ ﭼــﺎﻗﯩﺮﯨﺶ ﺑﯩــﻠﻪﻥ ﺑﯩــﺮ ﯞﺍﻗﯩﺘﺘــﺎ ﻣﯧﺘــﻮﺩﺗﯩﻦ ﺑﯩﺮﻧــﻰ‬ ‫ﺋﯧﻨﯩﻘﻠﯩــﺪﯗﻕ. ﺋﯧﻨﯩﻘﻼﻧﻐــﺎﻥ ﻧﺎﻣــﺴﯩﺰ ﻣﯧﺘــﻮﺩ ‪ Repeat10Times‬ﺗﯩــﭗ ﭘــﺎﺭﺍﻣﯧﺘﯩﺮﻯ ‪ someWork‬ﻗــﺎ‬ ‫ﻳﻮﻟﻠﯩﻨﯩﭗ ﻗﯩﺴﺘﯘﺭﯗﻟﻤﺎ ﺷﻪﻛﯩﻠﺪﻩ ﺋﯩﺠﺮﺍ ﺑﻮﻟﯩﯟﯦﺮﯨﺪﯗ، ﺋﯘﻧﯩﯔ ﺋﯜﭼﯜﻥ ﺋـﺎﻳﺮﯨﻢ ﺗـﯜﺭ ﺋﯧﻨﯩﻘﻼﺷـﻨﯩﯔ ﺋـﻮﺭﻧﻰ‬ ‫ﻗﺎﻟﻤﯩﺪﻯ. ﺑﯘ ﻳﻪﺭﺩﻩ ﺋﯧﻨﻘﻼﻧﻐﺎﻥ ﺋﺎﺷﯘ ﻧﺎﻣﻰ ﻳﻮﻕ ﻣﯧﺘﻮﺩ »ﻧﺎﻣﺴﯩﺰ ﻣﯧﺘﻮﺩ« ﺩﻩﭖ ﺋﺎﺗﯩﻠﯩﺪﯗ.‬ ‫ﻧﺎﻣﺴﯩﺰ ﻣﯧﺘﻮﺩ ﺋﯧﻨﯩﻘﻠﯩﻐﺎﻧﺪﺍ ﭼﻮﻗﯘﻡ ‪ delegate‬ﺧﺎﺱ ﺳﯚﺯﯨﺪﯨﻦ ﺑﺎﺷﻠﯩﻨﯩﺸﻰ ﻛﯧﺮﻩﻙ.‬ ‫ﺷﯘﻧﯩﺴﻰ ﺋﯧﺴﯩﯖﯩﺰﺩﺍ ﺗﯘﺭﺳﯘﻥ: ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ ﻛﻮﺩ ﺋﯩﭽﯩﮕﻪ ﻛـﻮﺩ ﻗﯩـﺴﺘﯘﺭﻏﯩﻠﻰ ﺑﻮﻟﻤﺎﻳـﺪﯗ، ﭘﻪﻗﻪﺕ ﻣﻪﻟـﯘﻡ‬ ‫ﻛﻮﺩﻗﺎ ﻗﺎﺭﯨﺘﯩﻠﻐﺎﻥ ﺋﯩﺴﺘﺮﯦﻠﻜﯩﻨﯩﻼ ﺑﺎﺷﻘﺎ ﻛﻮﺩ ﺑﯚﻟﯩﻜﻰ ﺋﯩﭽﯩﮕﻪ ﻗﯩﺴﺘﯘﺭﯗﺷﻘﺎ ﺑﻮﻟﯩﺪﯗ.‬ ‫ﺋﻪﮔﻪﺭ ﻧﺎﻣـﺴﯩﺰ ﻣﯧﺘـﻮﺩ ﻳﻮﻟﻼﻧﻤـﺎﻗﭽﻰ ﺑﻮﻟﻐـﺎﻥ ﺋﻮﺭﯗﻧـﺪﯨﻜﻰ ﻣـﯘﯞﻩﻗﻘﻪﺕ ﺗﯩﭙﻠﯩـﻖ ﭘـﺎﺭﺍﻣﯧﺘﯩﺮ ﺗﻪﯞﻩ ﺑﻮﻟﻐـﺎﻥ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻣــﯘﯞﻩﻗﻘﻪﺕ ﺗﯩﭙﯩﻨﯩــﯔ ﺋﻪﻧﺪﯨﺰﯨــﺴﯩﺪﻩ ﭘــﺎﺭﺍﻣﯧﺘﯩﺮ ﺑﯧﻜﯩــﺘﯩﻠﮕﻪﻥ ﺑﻮﻟــﺴﺎ، ‪ delegate‬ﺧــﺎﺱ ﺳــﯚﺯﯨﻨﯩﯔ‬ ‫ﺋﺎﺭﻗﯩﺴﯩﻐﺎ ﺗﯩﺮﻧﺎﻕ ﺋﯧﭽﯩﭗ ﭘﺎﺭﺍﻣﯧﺘﯩﺮﻟﯩﻖ ﺷﻪﻛﻠﯩﻨﻰ ﻗﻮﻟﻠﯩﻨﯩﺸﻘﺎ ﺑﻮﻟﯩﺪﯗ. ﺗﯚﯞﻩﻧـﺪﯨﻜﻰ ﻛـﻮﺩ 1.2 ﺩﯨﻜـﻰ‬ ‫‪ TwoParamsDlegate‬ﺗﯩﭙﯩﻐﺎ ﻣﺎﺱ ﻧﺎﻣﺴﯩﺰ ﻣﯧﺘﻮﺩ ﺋﺎﺋﯩﺖ ﻣﯩﺴﺎﻝ ﺑﯧﺮﯨﻠﺪﻯ:‬ ‫ﻛﻮﺩ 6.2‬ ‫ { ‪public class DemoDelegate‬‬ ‫ ‬ ‫ { ) ‪    void Repeat10Times( TwoParamsDelegate callback‬‬ ‫ ‪        for  (int  i  =  0;  i  <  10;  i++)  callback(  "Linq  book",  i‬‬ ‫ ;)‬ ‫ }    ‬ ‫ ‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫71‬ ‫ { )(3‪    void Run‬‬ ‫ { ) ‪        Repeat10Times( delegate( string text, int age‬‬ ‫ ;) ‪            Console.WriteLine( "{0} {1}", text, age‬‬ ‫ ;) }        ‬ ‫ }    ‬ ‫ … //    ‬ ‫ }‬ ‫‪ Enumerators‬ﯞﻩ ‪Yield‬‬ ‫#‪ C‬ﺩﻩ ﭼـــﺎﺭﻻﺵ ﻣﻪﺷـــﻐﯘﻻﺗﯩﻨﻰ ﻗـــﻮﻟﻠﯩﺘﯩﺶ ﺋﯜﭼـــﯜﻥ ﺋﯩﻜﻜـــﻰ ﺩﺍﻧﻪ ﺋﯧﻐﯩـــﺰ ﺗﻪﻣﯩـــﻨﻠﻪﻧﮕﻪﻥ.‬ ‫‪1.x‬‬ ‫‪ System.Collections‬ﻧﺎﻡ ﺑﻮﺷﻠﯩﻘﯩﺪﺍ ﺋﯘﻻﺭﻧﯩﯔ ﺋﯧﻨﯩﻘﻠﯩﻤﯩﺴﻰ ﺑﯧﺮﯨﻠﮕﻪﻥ:‬ ‫ﻛﻮﺩ 7.2‬ ‫ { ‪public interface IEnumerator‬‬ ‫ ;)(‪      bool MoveNext‬‬ ‫ } ;‪      object Current { get‬‬ ‫ ;)(‪      void Reset‬‬ ‫ }‬ ‫ { ‪public interface IEnumerable‬‬ ‫ ;)(‪      IEnumerator GetEnumerator‬‬ ‫ }‬ ‫ﺩﯦــﻤﻪﻙ، ‪ IEnumerable‬ﺋﯧﻐﯩﺰﯨﻨــﻰ ﺋﻪﻣﻪﻟــﮕﻪ ﺋﺎﺷــﯘﺭﻏﺎﻥ ﺋــﻮﺑﻴﯧﻜﺘﻨﻰ ‪ IEnumerator‬ﺋﯧﻐﯩﺰﯨﻨــﻰ‬ ‫ﺋﻪﻣﻪﻟــﮕﻪ ﺋﺎﺷــﯘﺭﻏﺎﻥ ﺋﻮﺑﻴﯧﻜــﺖ ﺋــﺎﺭﻗﯩﻠﯩﻖ ﭼــﺎﺭﻟﯩﻐﯩﻠﻰ ﺑﻮﻟﯩــﺪﯗ. ﭼــﺎﺭﻻﺵ ﻣﻪﺷــﻐﯘﻻﺗﻰ ‪MoveNext‬‬ ‫ﻣﯧﺘﻮﺩﯨﻨﻰ ﭼﺎﻗﯩﺮﯨﺶ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺗﺎﻛﻰ ‪ false‬ﻗﯩﻤﻤﻪﺕ ﻗﺎﻳﺘﯘﺭﯗﻟﻐﯩﭽﻪ ﺋﯧﻠﯩﭗ ﺑﯧﺮﯨﻼﻻﻳﺪﯗ.‬ ‫ـ‬ ‫ﻛــﻮﺩ 8.2 ﺩﻩ ﻳــﯘﻗﯩﺮﯨﻘﻰ ﺋﯘﺳــﯘﻝ ﺋــﺎﺭﻗﯩﻠﯩﻖ ﭼــﺎﺭﻟﯩﻐﯩﻠﻰ ﺑﻮﻟﯩــﺪﯨﻐﺎﻥ ﺗــﯜﺭ ﺋﯧﻨﯩﻘﻼﻧــﺪﻯ. ﻛــﯚﺭﯛﭖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺗﯘﺭﻏﯩﻨﯩﯖﯩﺰﺩﻩﻙ، ‪ CountdownEnumerator‬ﺗﯜﺭﻯ ﺋﯩﻨﺘﺎﻳﯩﻦ ﻣﯘﺭﻩﻛﻜﻪﭖ. ﺋﯘﻧﯩﯖـﺪﺍ، ﭼﺎﺭﻟﯩﻐﯘﭼﯩﻨﯩـﯔ‬ ‫ﻗﺎﻳﺘﯘﺭﯨــــﺪﯨﻐﯩﻨﻰ ﺑﺎﺷــــﻘﺎ ﻧﻪﺭﺳــــﻪ ﺋﻪﻣﻪﺱ ﺑﻪﻟﻜــــﻰ ‪ Countdown‬ﺗﯜﺭﯨــــﺪﻩ ﺋﯧﻨﯩﻘﻼﻧﻐــــﺎﻥ ﻣﯩﻘــــﺪﺍﺭ‬ ‫‪ StartCountdown‬ﺩﯨﻦ ﺑﺎﺷﻠﯩﻨﯩﭗ ﺑﯩﺮﺩﯨﻦ ﻛﯧﻤﯩﻴﯩﭗ ﺑﺎﺭﯨﺪﯨﻐﺎﻥ ﻗﯩﻤﻤﻪﺗﺘﯘﺭ.‬ ‫ﻛﻮﺩ 8.2‬ ‫ { ‪public class Countdown : IEnumerable‬‬ ‫ ;‪    public int StartCountdown‬‬ ‫ ‬ ‫ { )(‪    public IEnumerator GetEnumerator‬‬ ‫ ;) ‪        return new CountdownEnumerator( this‬‬ ‫ }    ‬ www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 18 }    public class CountdownEnumerator : IEnumerator {      private int _counter;      private Countdown _countdown;        public CountdownEnumerator( Countdown countdown ) {          _countdown = countdown;          Reset();      }        public bool MoveNext() {          if (_counter > 0) {              _counter‐‐;              return true;          }          else {              return false;          }      }        public void Reset() {          _counter = _countdown.StartCountdown;      }        public object Current {          get {              return _counter;          }      }  }  .‫ ﺋﯩﺸﻠﯩﺘﯩﻠﮕﻪﻧﺪﯨﻼ ﺋﯧﻠﯩﭗ ﺑﯧﺮﯨﻠﯩﺪﯗ‬CountdonwEnumerator ‫ﮬﻪﻗﯩﻘﯩﻲ ﭼﺎﺭﻻﺵ ﻣﻪﺷﻐﯘﻻﺗﻰ ﭘﻪﻗﻪﺕ‬ :‫ﻣﻪﺳﯩﻠﻪﻥ، ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺸﯩﮕﻪ ﻗﺎﺭﺍﯓ‬ 2.9 ‫ﻛﻮﺩ‬ public class DemoEnumerator {      public static void DemoCountdown() {          Countdown countdown = new Countdown();  ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫91‬ ‫ ;5 = ‪        countdown.StartCountdown‬‬ ‫ ‬ ‫ ;)(‪        IEnumerator i = countdown.GetEnumerator‬‬ ‫ { ))(‪        while (i.MoveNext‬‬ ‫ ;‪            int n = (int) i.Current‬‬ ‫ ;) ‪            Console.WriteLine( n‬‬ ‫ }        ‬ ‫ ;)(‪        i.Reset‬‬ ‫ { ))(‪        while (i.MoveNext‬‬ ‫ ;‪            int n = (int) i.Current‬‬ ‫ ;) ‪            Console.WriteLine( "{0} BIS", n‬‬ ‫ }        ‬ ‫ }    ‬ ‫ … //   ‬ ‫}‬ ‫‪ GetEnumerator‬ﻣﯧﺘﻮﺩﯨﻨﻰ ﭼﺎﻗﯩﺮﯨﺶ ﺋﺎﺭﻗﯩﻠﯩﻖ ﭼﺎﺭﻟﯩﻐﯘﭼﻰ ﺋﻮﺑﻴﯧﻜﺖ ﺗﻪﻣﯩﻨﻠﯩﻨﯩﺪﯗ. ﻛﻮﺩﺩﺍ، ﺑﯩـﺰ،‬ ‫‪ Reset‬ﻣﯧﺘﻮﺩﯨﻨﯩ ـﯔ ﺭﻭﻟﯩﻨ ـﻰ ﻧﺎﻣ ـﺎﻳﻪﻥ ﻗﯩﻠﯩ ـﺶ ﺋﯜﭼ ـﯜﻥ ﺋﯩﻜﻜ ـﻰ ﻗﯧ ـﺘﯩﻢ ﺋﺎﻳﻼﻧ ـﺪﯗﺭﯗﺵ)‪ (loop‬ﺋﯧﻠﯩ ـﭗ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑ ـﺎﺭﺩﯗﻕ. ‪ Current‬ﺧﺎﺳ ـﻠﯩﻘﻰ ﺋ ـﺎﺭﻗﯩﻠﯩﻖ ﺋﯧﺮﯨ ـﺸﻜﻪﻥ ﻗﯩﻤﻤﻪﺗﻨ ـﻰ ﭼﻮﻗ ـﯘﻡ ‪ int‬ﻏ ـﺎ ﺋﺎﻳﻼﻧﺪﯗﺭﯗﺷ ـﯩﻤﯩﺰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻛﯧﺮﻩﻙ. ﭼﯜﻧﻜﻰ ﺑﯩﺰﻧﯩﯔ ﺋﯩﺸﻠﻪﺗﻜﯩﻨﯩﻤﯩﺰ ﭼﺎﺭﻻﺵ ﺋﯧﻐﯩﺰﻟﯩﺮﯨﻨﯩـﯔ ﻛﯚﭘﻤـﺎﺱ ﻧﯘﺳـﺨﯩﻠﯩﺮﻯ ﺑﻮﻟﻤﯩﻐﺎﭼﻘـﺎ،‬ ‫‪ Current‬ﺩﯨﻦ ﻗﺎﻳﺘﯩﺪﯨﻐﯩﻨﻰ ‪ object‬ﺗﯩﭙﻠﯩﻖ ﺑﻮﻟﯩﺪﯗ.‬ ‫ﺋﻪﺳ ـﻜﻪﺭﺗﯩﺶ: 0.2 #‪ C‬ﺩﺍ ﻳﯧﯖﯩ ـﺪﯨﻦ ﻗﻮﺷ ـﯘﻟﻐﺎﻥ ﻛﯚﭘﻤ ـﺎﺱ ﺋﯘﻗ ـﯘﻣﯩﻨﻰ ﭼ ـﺎﺭﻻﺵ ﺋﯧﻐﯩﺰﻟﯩﺮﯨﻐﯩﻤ ـﯘ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻗﻮﻟﻼﻧﻐﺎﻥ. ﻣﺎﺱ ﮬﺎﻟﺪﺍ، ‪ System.Collections.Generic‬ﻧﺎﻡ ﺑﻮﺷﻠﯘﻗﯩﺪﺍ >‪IEnumerable‪ IEnumerator= 0; i‬‬ ‫ ;‪            yield return i‬‬ ‫ }        ‬ ‫ }    ‬ ‫ }‬ ‫ﻟﻮﮔﯩﻜﺎ ﻧﯘﺧﺘﯩﺴﯩﺪﯨﻦ ﺋﯧﻠﯩﭗ ﺋﯧﻴﺘﻘﺎﻧﺪﺍ، ‪ yield return‬ﺟﯜﻣﻠﯩﺴﻰ ﺋﯩﺠـﺮﺍ ﻣﻪﺷـﻐﯘﻻﺗﯩﻨﻰ ﯞﺍﻗﯩﺘﻠﯩـﻖ‬ ‫ﺗﻮﺧﺘﯩﺘﯩ ـﭗ ﻗﻮﻳ ـﯘﺵ ﺑﯩ ـﻠﻪﻥ ﺑ ـﺎﺭﺍﯞﻩﺭ ﺑﻮﻟ ـﯘﭖ، ‪ MoveNext‬ﻛﯧﻴﯩﻨﻜ ـﻰ ﻗﯧ ـﺘﯩﻢ ﭼﺎﻗﯩﺮﯨﻠﻐﺎﻧ ـﺪﺍ ﺋﺎﻧ ـﺪﯨﻦ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺩﺍﯞﺍﻣﻠﯩــﺸﯩﺪﯗ. ﺷﯘﻧﯩــﺴﻰ ﺋﯧــﺴﯩﯖﯩﺰﺩﻩ ﺑﻮﻟــﺴﯘﻥ، ﭘﯜﺗﻜــﯜﻝ ﭼــﺎﺭﻻﺵ ﺟﻪﺭﻳﺎﻧﯩــﺪﺍ ‪GetEnumerator‬‬ ‫ﻣﯧﺘﻮﺩﻯ ﭘﻪﻗﻪﺕ ﺑﯩﺮﻻ ﻗﯧﺘﯩﻢ ﭼﺎﻗﯩﺮﯨﻠﯩﭗ ‪ IEnumerator‬ﺋﯧﻐﯩﺰﯨﻨﻰ ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﺎﻥ ﺗﯜﺭ ﻗـﺎﻳﺘﯘﺭﯗﭖ‬ ‫ﺑﯧﺮﯨ ـﺪﯗ. ﭘﻪﻗﻪﺕ ﻣﯘﺷ ـﯘ ﺗ ـﯜﺭﻻ ‪ yield‬ﺟﯜﻣﻠﯩ ـﺴﯩﻨﻰ ﺋ ـﯚﺯ ﺋﯩﭽﯩ ـﮕﻪ ﺋﺎﻟﻐ ـﺎﻥ ﻣﯧﺘ ـﻮﺩ ﺧ ـﯘﻟﻘﯩﻨﻰ ﮬﻪﻗﯩﻘﯩ ـﻲ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﺎﻥ ﺑﻮﻟﯩﺪﯗ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫12‬ ‫‪ yield‬ﺟﯜﻣﻠﯩﺴﯩﻨﻰ ﺋﯚﺯ ﺋﯩﭽﯩﮕﻪ ﺋﺎﻟﻐﺎﻥ ﻣﯧﺘﻮﺩ »‪ «interator, 迭代器‬ﺩﻩﭖ ﺋﺎﺗﯩﻠﯩﺪﯗ )ﭼﺎﺭﻟﯩﻐﯘﭼﻰ،‬ ‫ﻳﻪﻧﻰ ﺑﯩﺮﺩﯨﻦ-ﺑﯩﺮﺩﯨﻦ ﺋﯧﻠﯩﭗ ﺗﻪﻛﺸﯜﺭﮔﯜﭼﻰ(. ﺑﯩﺮ ﺩﺍﻧﻪ ‪ interator‬ﺑﯩﺮﻗﺎﻧﭽﻪ ‪ yield‬ﺟﯜﻣﻠﯩﺴﯩﻨﻰ‬ ‫ﺋﯚﺯ ﺋﯩﭽﯩﮕﻪ ﺋﺎﻻﻻﻳﺪﯗ. ﻛﻮﺩ 21.2 ﺩﯨﻜﯩﺪﻩﻙ ﻳﯧﺰﯨﺶ ﻗﺎﺋﯩﺪﯨﮕﻪ ﻣﯘﺗﻠﻪﻕ ﺋﯘﻳﻐﯘﻥ ﺑﻮﻟﯘﭖ، ﺋﯩﻘﺘﯩﺪﺍﺭ‬ ‫ﺟﻪﮬﻪﺗﺘﻪ ﺋﺎﻟﺪﯨﻨﻘﻰ ﻣﯩﺴﺎﻟﺪﯨﻜﻰ ‪ CountdownYield‬ﺗﯜﺭﯨﻨﯩﯔ ‪ StartCountdown‬ﺧﺎﺳﻠﯩﻘﯩﻨﯩﯔ 5‬ ‫ﺩﯨﻦ ﺑﺎﺷﻼﻧﻐﺎﻥ ﮬﺎﻟﯩﺘﻰ ﺑﯩﻠﻪﻥ ﺑﺎﺭﺍﯞﻩﺭ.‬ ‫ﻛﻮﺩ 21.2‬ ‫ { ‪public class CountdownYieldMultiple : IEnumerable‬‬ ‫ { )(‪    public IEnumerator GetEnumerator‬‬ ‫ ;4 ‪        yield return‬‬ ‫ ;3 ‪        yield return‬‬ ‫ ;2 ‪        yield return‬‬ ‫ ;1 ‪        yield return‬‬ ‫ ;0 ‪        yield return‬‬ ‫ }    ‬ ‫ }‬ ‫‪ IEnumerator‬ﻧﯩــﯔ ﻛﯚﭘﻤــﺎﺱ ﻧﯘﺳﺨﯩــﺴﯩﻨﻰ ﻗــﻮﻟﻠﯩﻨﯩﺶ ﺋــﺎﺭﻗﯩﻠﯩﻖ ‪ CountdownYield‬ﺗﯜﺭﯨﻨﯩــﯔ‬ ‫ﻛﯜﭼﻠـﯜﻙ ﺗﯩﭙﻼﻧﻐـﺎﻥ )‪ (strongly typed, 强类型‬ﻧﯘﺳﺨﯩـﺴﯩﻨﻰ ﯞﯗﺟﯘﺩﻗـﺎ ﭼﯩﻘـﺎﺭﻏﯩﻠﻰ ﺑﻮﻟﯩـﺪﯗ.‬ ‫ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫ﻛﻮﺩ 31.2‬ ‫ { >‪public class CountdownYieldTypeSafe : IEnumerable GetEnumerator‬‬ ‫ { )‐‐‪        for (int i = StartCountdown ‐ 1; i >= 0; i‬‬ ‫ ;‪            yield return i‬‬ ‫ }        ‬ ‫ }    ‬ ‫ }‬ ‫ﻛﯜﭼﻠﯜﻙ ﺗﯩﭙﻼﻧﻐﺎﻥ ﻧﯘﺳﺨﯩﺴﯩﺪﺍ ﺋﯩﻜﻜﻰ ﺩﺍﻧﻪ ‪ GetEnumerator‬ﻣﯧﺘﻮﺩﻯ ﺋﯧﻨﯩﻘﻼﻧﻐﺎﻥ ﺑﻮﻟـﯘﭖ، ﺑﯩـﺮﻯ‬ ‫ﻛﯚﭖ ﻣـﺎﺱ ﺑﻮﻟﻤﯩﻐـﺎﻥ ﻛﻮﺩﻻﺭﻏـﺎ )‪ IEnumerable‬ﻧـﻰ ﻗﺎﻳﺘﯘﺭﯨـﺪﯨﻐﺎﻥ( ﻣـﺎﺱ ﻛﯧﻠﯩـﺪﯗ، ﻳﻪﻧﻪ ﺑﯩـﺮﻯ‬ ‫ﺑﻮﻟﺴﺎ ﻛﯜﭼﻠﯜﻙ ﺗﯩﭙﻼﻧﻐﯩﻨﻰ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫22‬ ‫0.3 #‪ C‬ﻧﯩﯔ ﺧﯘﺳﯘﺳﯩﻴﻪﺗﻠﯩﺮﻯ‬ ‫‪ var‬ﺧﺎﺱ ﺳﯚﺯﻯ‬ ‫ﻳﯧﯖﯩ ـﺪﯨﻦ ﻗﻮﺷ ـﯘﻟﻐﺎﻥ ‪ var‬ﺧ ـﺎﺱ ﺳ ـﯚﺯﻯ ﺋ ـﺎﺭﻗﯩﻠﯩﻖ، ﺗﯩﭙ ـﻰ ﺋﯧﻨﯩ ـﻖ ﺑﻮﻟﻤﯩﻐ ـﺎﻥ ﺋﯚﺯﮔﻪﺭﮔ ـﯜﭼﻰ ﻣﯩﻘ ـﺪﺍﺭ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫‪.NET‬‬ ‫ﺋﯧﻨﯩﻘﻼﺷــﻘﺎ ﺑﻮﻟﯩــﺪﯗ. ‪ var‬ﺑﯩــﻠﻪﻥ ﺑﺎﺷــﻘﺎ »ﺋﯧﻨﯩــﻖ ﺗﯩــﭙﻼﺭ« ﺋﺎﺭﯨــﺴﯩﺪﯨﻜﻰ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺷــﻨﻰ‬ ‫‪ object‬ﺋﺎﺭﻗﯩﻠﯩﻖ ﺋﯧﻨﯩﻘﻼﺷﻘﺎ ﺑﺎﺭﺍﯞﻩﺭ ﺋﻪﻣﻪﺱ. ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻣﯩﺴﺎﻝ ﺑﯘﻧﯩﯖﻐﺎ ﺋﯩﺴﭙﺎﺕ ﺑﻮﻻﻻﻳﺪﯗ:‬ ‫ﻗﯘﺭﯗﻟﻤﯩــﺴﻰ ﺋﺎﭘﺘﻮﻣﺎﺗﯩــﻚ ﺑﯧﺠﯩﺮﻩﻟﻪﻳ ـﺪﯗ. ﺷــﯘﻧﻰ ﺋﻪﺳــﻜﻪﺭﺗﯩﺶ ﺯﯙﺭﯛﺭﻛــﻰ، ‪ var‬ﺋــﺎﺭﻗﯩﻠﯩﻖ ﺋﯧــﻨﯩﻘﻼﺵ‬ ‫;2 = ‪var a‬‬ ‫ﭘﯜﺗﯜﻥ ﺳﺎﻥ ﺗﯩﭙﻠﯩﻖ ﻗﯩﻠﯩﭗ ﺋﯧﻨﯩﻘﻼﻧﺪﻯ //‬ ‫;2 = ‪object b‬‬ ‫ﻗﯩﻤﻤﻪﺗﻠﯩﻚ ﺗﯩﭗ ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺗﯩﭙﻘﺎ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﻟﺪﻯ، ﺳﻪﺭﭘﯩﻴﺎﺗﻰ ﻳﯘﻗﯩﺮﻯ //‬ ‫;‪int c = a‬‬ ‫ﮬﯩﭻ ﻗﺎﻧﺪﺍﻕ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻳﯜﺯ ﺑﻪﺭﻣﻪﻳﺪﯗ، ﺗﯧﺰ //‬ ‫ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺗﯩـﭗ ﻗﯩﻤﻤﻪﺗﻠﯩـﻚ ﺗﯩﭙﻘـﺎ ﻣﻪﺟﺒـﯘﺭﻯ ﺋﺎﻟﻤﺎﺷـﺘﯘﺭﯗﻟﯩﺪﯗ، ﺳـﻪﺭﭘﯩﻴﺎﺕ // ;‪int d = (int) b‬‬ ‫ﻳﯘﻗﯩﺮﻯ‬ ‫‪var‬ﻧﯩﯔ ﮬﻪﻗﯩﻘﯩﻲ ﺗﯩﭙﯩﻨﯩﯔ ﻗﺎﻧﺪﺍﻕ ﺑﻮﻟﯘﺷﻰ ﺋﻪﻣﻪﻟﯩﻲ ﺋﻪﮬﯟﺍﻟﻐﺎ ﻗﺎﺭﺍﭖ ﺑﯧﻜﯩﺘﯩﻠﯩﺪﯗ‬ ‫ ;5 = ‪int a‬‬ ‫ ;‪var b = a‬‬ ‫ﺑﯘ ﺋﯩﻜﻜﻰ ﺧﯩﻞ ﺋﯧﻨﯩﻘﻼﺵ ﺑﺎﺭﺍﯞﻩﺭ‬ ‫ ;5 = ‪int a‬‬ ‫ ;‪int b = a‬‬ ‫#‪ C‬ﺗﯩﻠﯩــﺪﺍ ﺗﯩﭙﻼﺭﻧﯩــﯔ ﺗــﯜﺭﻟﯩﺮﻯ ﺷــﯘﻧﭽﯩﻠﯩﻚ ﺗﻮﻟــﯘﻕ ﺗﯘﺭﯗﻗﻠــﯘﻕ ﻳﻪﻧﻪ ﻧﯧﻤﯩــﺸﻘﺎ ﭘﺮﻭﮔﺮﺍﻣﻤﯩﻨﯩــﯔ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻗﺎﺭﯨﻤﺎﻗﻘ ـﺎ ‪ var‬ﮬ ـﻮﺭﯗﻥ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﻮﻗﯘﺷ ـﭽﺎﻧﻠﯩﻘﯩﻨﻰ ﺗﯚﯞﻩﻧﻠﯩﺘﯩﯟﯦﺘﯩ ـﺪﯨﻐﺎﻥ ‪ var‬ﺧ ـﺎﺱ ﺳ ـﯚﺯﯨﻨﻰ ﺋﯩ ـﺸﻠﯩﺘﯩﻤﯩﺰ؟‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﯚﺯﮔﻪﺭﮔﯜﭼﻰ ﻣﯩﻘﺪﺍﺭ«)ﻛﯧﻴﯩﻦ ﺳﯚﺯﻟﯩﻨﯩﺪﯗ( ﺋﯧﻨﯩﻘﻼﺷﻨﯩﯔ ﺑﯩﺮﺩﯨﻦ- ﺑﯩﺮ ﻳﻮﻟﻰ.‬ ‫ـ‬ ‫ـ‬ ‫ﺑ ـﯘ ﻳﻪﺭﺩﯨﻜ ـﻰ ‪ var‬ﺗﯩ ـﭗ- ﺑﯩﺨﻪﺗﻪﺭﻟﯩﻜﯩﻨ ـﻰ ﺋﻪﻣﻪﻟ ـﮕﻪ ﺋﺎﺷ ـﯘﺭﻏﺎﻧﻠﯩﻘﻰ ﺋﯜﭼ ـﯜﻥ ‪ Vsiaul Basic‬ﺩﯨﻜ ـﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫‪var‬ﺧﺎﺱ ﺳﯚﺯﯨﺪﯨﻦ ﭘﻪﺭﻗﻠﯩﻨﯩﺪﯗ)ﻛﯚﭖ ﻛﯜﭼﻠﯜﻙ(.‬ ‫‪ Var‬ﺗﯩﭙﯩﻨﻰ ﭘﻪﻗﻪﺕ ﻳﻪﺭﻟﯩﻚ ﺋﻮﺭﯗﻧﺪﯨﻼ ﺋﯩﺸﻠﯩﺘﯩﺸﻜﻪ ﺑﻮﻟﯩﺪﯗ. ﺋﯘﻧﻰ ﺗﯜﺭﻧﯩﯔ ﻣﯧﺘﻮﺩﻻﺭﻧﯩﯔ ﭘـﺎﺭﺍﻣﯧﺘﯩﺮﻯ‬ ‫ﻳﺎﻛﻰ ﻗﺎﻳﺘﯘﺭﻣﺎ ﻗﯩﻤﻤﯩﺘﯩﻨﯩﯔ ﺗﯩﭙﻰ ﺋﻮﺭﻧﯩﺪﺍ ﺋﯩﺸﻠﯩﺘﯩﺸﻜﻪ ﺑﻮﻟﻤﺎﻳﺪﯗ.‬ ‫ﺗﻮﻏﺮﺍ ﺋﯩﺸﻠﯩﺘﯩﺶ ﺋﯘﺳﯘﻟﻰ:‬ ‫ﻛﻮﺩ 2‬ ‫ﭘﺮﻭﮔﺮﺍﻣﻤﯩﻼﺭﻧﯩــﯔ ﺋﯧﮫﺘﯩﻴــﺎﺟﻰ ﺋﯜﭼــﯜﻥ ﻻﻳﯩﮫﻪﻟﻪﻧﮕﻪﻧــﺪﻩﻙ ﺗﯘﺭﺳــﯩﻤﯘ، ﺋﻪﻣﻪﻟﯩﻴﻪﺗــﺘﻪ ﺋــﯘ »ﻧﺎﻣــﺴﯩﺰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ { ) ‪public void ValidUse( decimal d‬‬ ‫ ‪    var x = 2.3;             // double‬‬ ‫ ‪    var y = x;               // double‬‬ ‫ ‪    var r = x / y;           // double‬‬ ‫ ‪    var s = "sample";        // string‬‬ ‫ ‪    var l = s.Length;        // int‬‬ ‫ ‪    var w = d;               // decimal‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫32‬ ‫ ‪    var p = default(string); // string‬‬ ‫ }‬ ‫ﺧﺎﺗﺎ ﺋﯩﺸﻠﯩﺘﯩﺶ ﺋﯘﺳﯘﻟﻰ:‬ ‫ﻛﻮﺩ 3‬ ‫ { ‪class VarDemo‬‬ ‫ﺗﯜﺭ ﻳﺎﻛﻰ ﺋﯧﻐﯩﺰﻻﺭﻧﯩﯔ ﺧﺎﺳﻠﯩﻘﻰ ﺳﯜﭘﯩﺘﯩﺪﻩ ﺋﯩﺸﻠﯩﺘﯩﺸﻜﻪ ﺑﻮﻟﻤﺎﻳﺪﯗ //‬ ‫ ;0= ‪ var k‬‬ ‫ﭘﺎﺭﺍﻣﯧﺘﯩﺮﺩﺍ ﺋﯧﻨﯩﻖ ﺗﯩﭙﻰ ﺑﯧﻜﯩﺘﯩﻠﯩﺸﻰ ﻛﯧﺮﻩﻙ //‬ ‫ }{) ‪public void InvalidUseParameter( var x‬‬ ‫ﻗﺎﻳﺘﯘﺭﻣﺎ ﻗﯩﻤﻤﻪﺕ ﺗﯩﭙﻰ ﺋﯧﻨﯩﻖ ﺑﻮﻟﯘﺷﻰ ﻛﯧﺮﻩﻙ //‬ ‫ { )(‪    public var InvalidUseResult‬‬ ‫ ;2 ‪        return‬‬ ‫ }    ‬ ‫ { )(‪    public void InvalidUseLocal‬‬ ‫ ;‪var x‬‬ ‫ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩﻠﯩﻖ ﺧﺎﺗﺎﻟﯩﻖ، ﺗﻪﯕﻠﯩﻚ ﺑﻪﻟﮕﯩﺴﻰ ﺑﻮﻟﯘﺷﻰ ﻛﯧﺮﻩﻙ //‬ ‫;‪var y = null‬‬ ‫'‪ 'null‬ﻧﯩﯔ ﻗﺎﻳﺴﻰ ﺗﯩﭗ ﺋﯩﻜﻪﻧﻠﯩﻜﯩﻨﻰ ﺑﯩﻠﻪﻟﻤﻪﻳﺪﯗ//‬ ‫ }    ‬ ‫ … //   ‬ ‫ }‬ ‫ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪ ﻣﯧﺘﻮﺩ‬ ‫#‪ C‬ﺑﻮﻟﺴﺎ ﺋﻮﺑﻴﯧﻜﺘﻘﺎ ﻳﯜﺯﻟﻪﻧﮕﻪﻥ ﺗﯩﻞ ﺑﻮﻟـﯘﭖ، ﺋﺎﺗـﺎ ﺗـﯜﺭﮔﻪ ﺑـﺎﻻ ﺗـﯜﺭﻧﻰ ﯞﺍﺭﯨـﺴﻠﯩﻖ ﻗﯩﻠـﺪﯗﺭﯗﭖ ﻳﯧﯖـﻰ‬ ‫ﻣﯧﺘﻮﺩﻻﺭﻧﻰ ﻗﻮﺷﯘﺵ ﻳﺎﻛﻰ ﺋﻪﺳﻠﻰ ﺑﺎﺭ ﺑﻮﻟﻐـﺎﻥ ﻣﯧﺘـﻮﺩﻻﺭﻧﻰ ﻗﺎﻳﺘـﺎ ﻳـﯧﯖﯩﻼﺵ ﺋـﺎﺭﻗﯩﻠﯩﻖ ﺋﺎﺗـﺎ ﺗﯜﺭﻧﯩـﯔ‬ ‫ﺋﯩﻘﺘﯩ ـﺪﺍﺭﯨﻨﻰ ﺋﺎﺷ ـﯘﺭﯗﺵ ﻣﻪﻗ ـﺴﯩﺘﯩﮕﻪ ﻳﻪﺗﻜﯩﻠ ـﻰ ﺑﻮﻟﯩ ـﺪﯗ. ﺑﯩ ـﺮﺍﻕ »ﺑﯩﺨﻪﺗﻪﺭﻟﯩ ـﻚ« ﺑﯩ ـﻠﻪﻥ »ﺟ ـﺎﻧﻠﯩﻖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﯩــﺸﻠﯩﺘﯩﺶ« ﺑــﯘ ﺧﯩــﻞ ﻣﻪﺳــﯩﻠﯩﻠﻪﺭﻧﻰ ﮬﻪﻝ ﻗﯩﻠﯩــﺸﺘﯩﻜﻰ ﺋﯩﻜﻜــﻰ ﻗــﺎﺭﻣﯘ-ﻗﺎﺭﺷــﻰ ﺋﺎﻣﯩــﻞ ﺑﻮﻟــﯘﭖ‬ ‫ﻛﯧﻠﯩﯟﺍﺗﯩﺪﯗ.‬ ‫0.3#‪ C‬ﺩﻩ ﻧﯚﯞﻩﺗﺘﻪ ﺑﺎﺭ ﺑﻮﻟﻐﺎﻥ )‪ .Net‬ﻧﯩﯔ ﺋﯚﺯﯨﺪﻩ ﺑﺎﺭ ﺑﻮﻟﻐﺎﻧﻠﯩﺮﯨﻤﯘ ﺷﯘ( ﺗﯜﺭ )ﺗﯩﭙﻼﺭﻣـﯘ ﺷـﯘ( ﻻﺭﻏـﺎ‬ ‫ﻳﯧﯖﻰ ﺗﯜﺭﻧﻰ ﯞﺍﺭﯨﺴﻠﯩﻖ ﻗﯩﻠﺪﯗﺭﻣﺎﻱ ﺗﯘﺭﯗﭖ ﻳﯧﯖﻰ ﺋﯩﻘﺘﯩﺪﺍﺭ ﻗﻮﺷﯘﺷﻘﺎ ﻳﻮﻝ ﻗﻮﻳﯘﻟﻐﺎﻥ ﯞﻩ ﻣﯘﻧﺎﺳـﯩﯟﻩﺗﻠﯩﻚ‬ ‫ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﯗﺵ ﻗﺎﺋﯩﺪﯨﻠﯩﺮﻯ ﺑﻪﻟﮕﯩﻠﻪﻧﮕﻪﻥ. ﻣﻪﺳﯩﻠﻪﻥ ﭘﯜﺗﯜﻥ ﺳﺎﻥ ﺗﯩﭙﻰ ‪ int‬ﻧﻰ ﻣﯩﺴﺎﻟﻐﺎ ﺋﺎﻟﺴﺎﻕ:‬ ‫ﻛﻮﺩ 4‬ ‫ ;5= ‪int i‬‬ ‫ 6 == ‪Int j = i+1;     //j‬‬ ‫4 == ‪int t = i‐1;     //t‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫42‬ ‫ﺑﯘ ﺋﯜﭺ ﻗﯘﺭ ﭘﺮﻭﮔﺮﺍﻣﻤﺎ ﮬﻪﻣﻤﯩﻤﯩﺰﮔﻪ ﭼﯜﺷﯩﻨﯩﺸﻠﯩﻚ. ﻳﯘﻗﯩﺮﯨﻘﻰ ﺟﯜﻣﻠﯩﻠﻪﺭﻧﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻳﻮﻝ ﺋـﺎﺭﻗﯩﻠﯩﻖ‬ ‫ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﯩﻠﻰ ﺑﻮﻻﻣﺪﯗ ﺩﻩﭖ ﭘﻪﺭﻩﺯ ﻗﯩﻠﯩﭗ ﺑﺎﻗﺎﻳﻠﻰ:‬ ‫ﻛﻮﺩ 5‬ ‫ ;5= ‪int i‬‬ ‫ 6 == ‪Int j = i.Increase();    // j‬‬ ‫4 == ‪int t = i.Decrease();    // t‬‬ ‫ﺑﯘﻧﯩﯔ ﺋﯜﭼﯜﻥ ‪ int‬ﺗﯩﭙﯩﻨﯩﯔ ﭼﻮﻗﯘﻡ ﺋﯚﺯ ﻗﯩﻤﻤﯩﺘﯩﻨﻰ ﺑﯩﺮ ﺋﺎﺷﯘﺭﯗﭖ ﻳﺎﻛﻰ ﺑﯩﺮ ﺗﯚﯞﻩﻧﻠﯩﺘﯩـﭗ ﻗـﺎﻳﺘﯘﺭﯗﭖ‬ ‫ﺑﯧﺮﻩﻟﻪﻳـﺪﯨﻐﺎﻥ )(‪Increase‬ﯞﻩ )(‪ Decrease‬ﻧ ـﺎﻣﻠﯩﻖ )ﻳ ـﺎﻛﻰ ﺑﺎﺷـﻘﺎ ﻧ ـﺎﻣﻠﯩﻖ( ﻣﯧﺘ ـﻮﺩﻟﯩﺮﻯ ﺑﻮﻟﯘﺷ ـﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻛﯧــــﺮﻩﻙ. ﻟــــﯧﻜﯩﻦ ﺋﻪﺳــــﻠﻰ ﻗﯘﺭﯗﻟﻤﯩــــﺪﺍ ‪int‬ﻧﯩــــﯔ ﺑــــﯘ ﺋﯩﻘﺘﯩــــﺪﺍﺭﻟﯩﺮﻯ ﺗﻪﻣﯩــــﻨﻠﻪﻧﻤﯩﮕﻪﻥ. ﺑﯩــــﺰ‬ ‫ﺩﻩﯞﺍﺗﻘــﺎﻥ»ﻛﯧﯖﻪﻳــﺘﯩﻠﮕﻪﻥ ﻣﯧﺘــﻮﺩ« ﺋﯩﻘﺘﯩــﺪﺍﺭﻯ ﺩﻩﻝ ﻣﯘﺷــﯘﻧﯩﯖﺪﻩﻙ ﻣﻪﺳــﯩﻠﯩﻠﻪﺭﮔﻪ ﺗﺎﻗﺎﺑﯩــﻞ ﺗــﯘﺭﯗﺵ‬ ‫ﻣﻪﻗﺴﯩﺘﯩﺪﻩ ﻗﻮﺷﯘﻟﻐﺎﻥ.‬ ‫ﺋﻪﻣﺪﻯ ﺑﯩﺰ ‪int‬ﻧﻰ ﻛﯧﯖﻪﻳﺘﯩﭗ ﺑﺎﻗﺎﻳﻠﻰ. ﻧـﯚﯞﻩﺗﺘﯩﻜﻰ ﺗـﯜﺭﯨﻤﯩﺰﮔﻪ)‪ (project‬ﻳﯧﯖﯩـﺪﯨﻦ ﺗـﯜﺭ ﻗﻮﺷـﯘﭖ‬ ‫ﺋﯘﻧﯩــﯔ ﺋﯩــﺴﻤﯩﻨﻰ ‪IntegerExtension‬ﺩﻩﭖ ﻗﻮﻳــﺎﻳﻠﻰ.)ﺧﺎﻟﯩﻐــﺎﻧﭽﻪ ﻗﻮﻳــﺴﯩﯖﯩﺰ ﺑﻮﻟﯩــﺪﯗ(. ﺋﯘﻧﯩــﯔ‬ ‫ﻣﻪﺯﻣﯘﻧﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﺑﻮﻟﺴﯘﻥ:‬ ‫ﻛﻮﺩ 6‬ ‫ 5‪namespace ConsoleApplication‬‬ ‫ {‬ ‫ ‪    static class IntegerExtension‬‬ ‫ {    ‬ ‫ )‪        public static int Increase(this int i‬‬ ‫ {        ‬ ‫ ;1 + ‪            return i‬‬ ‫ }        ‬ ‫ )‪        public static int Decrease(this int i‬‬ ‫ {        ‬ ‫ ;1 ‐ ‪            return i‬‬ ‫ }        ‬ ‫ }    ‬ ‫ﺋﻪﻣﺪﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﺭﻩﺳﯩﻤﮕﻪ ﻗﺎﺭﺍﯓ:‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫52‬ ‫ﺩﯦﻤﻪﻙ، )(‪Increase‬ﺑﯩﻠﻪﻥ )(‪ Decrease‬ﺋﻪﻣﺪﻯ ‪ int‬ﻧﯩﯔ »ﺑﻮﻟﯘﭖ ﻛﻪﺗﺘﻰ«.‬ ‫ﻳﯧــﺰﯨﺶ ﻗﺎﺋﯩﺪﯨــﺴﯩﻨﻰ ﺗﯧﺨﯩﻤــﯘ ﺗﻪﭘــﺴﯩﻠﯩﻴﺮﻩﻙ ﭼﯜﺷــﯜﻧﯜﺵ ﺋﯜﭼــﯜﻥ )(‪ Increase‬ﻣﯧﺘــﻮﺩﯨﻨﻰ ﻣﯩــﺴﺎﻟﻐﺎ‬ ‫ﺋﺎﻻﻳﻠﻰ. ﻛﯧﯖﻪﻳﺘﯩﺶ ﺋﯘﺳﯘﻟﯩﻨﯩﯔ ﺋﻮﺭﺗﺎﻕ ﻗﯘﺭﯗﻟﻤﯩﺴﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﺑﻮﻟﯩﺪﯗ:‬ ‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﻗﯘﺭﯗﻟﻤﯩﺪﯨﻜﻰ ﺋﺎﺳﺘﯩﻐﺎ ﻗﯩﺰﯨﻞ ﺳﯩﺰﯨﻖ ﺳﯩﺰﯨﻠﻐﺎﻧﻠﯩﺮﯨﻨﻰ ﺋﯚﺯ ﭘﯧﺘﻰ ﻳﯧﺰﯨﺸﯩﯖﯩﺰ ﻛﯧﺮﻩﻙ. ﻳﯧﺸﯩﻞ‬ ‫ﺳﯩﺰﯨﻖ ﺳﯩﺰﯨﻠﻐﺎﻧﻠﯩﺮﻯ ﺑﻮﻟﺴﺎ ﺋﯧﮫﺘﯩﻴﺎﺟﻐﺎ ﻗﺎﺭﺍﭖ ﺋﯚﺯﮔﯩﺮﯨﺪﯗ. ﺩﯦﻤﻪﻙ:‬ ‫ﻛﯧﯖﻪﻳ ــﺘﯩﺶ ﻣﯧﺘ ــﻮﺩﻯ ﯞﻩ ﺋ ــﯘﻧﻰ ﺋـــﯚﺯ ﺋﯩﭽﯩ ــﮕﻪ ﺋﺎﻟﻐ ــﺎﻥ ﺗـــﯜﺭ ﭼﻮﻗ ــﯘﻡ ﺗﯘﺭﺍﻗﻠﯩ ــﻖ ﺑﻮﻟﯘﺷـــﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻛﯧﺮﻩﻙ)‪.(static‬‬ ‫ﻛﯧﯖﻪﻳ ــﺘﯩﺶ ﻣﯧﺘﻮﺩﯨﻨﯩ ــﯔ ﭘ ــﺎﺭﺍﻣﯧﺘﯩﺮﻯ ﺋﺎﻟ ــﺪﯨﻐﺎ ‪ this‬ﺧ ــﺎﺱ ﺳ ــﯚﺯﯨﻨﻰ ﻗﻮﺷ ــﯘﺵ ﺋ ــﺎﺭﻗﯩﻠﯩﻖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪﻛﭽﻰ ﺑﻮﻟﻐـﺎﻥ ﺗﯩﭙﻨـﻰ ﺑﻪﻟﮕﯩﻠﯩـﺸﯩﻤﯩﺰ ﻛﯧـﺮﻩﻙ. ﻣﻪﺳـﯩﻠﻪﻥ: ﻳﯘﻗـﺎﺭﻗﻰ ﻣﯩـﺴﺎﻟﺪﺍ ‪ int‬ﺗﯩﭙﯩﻨـﻰ‬ ‫ﻛﯧﯖﻪﻳﺘﯩﺪﯗ.‬ ‫ﻛﯧﯖﻪﻳﺘﯩﺶ ﻣﯧﺘﻮﺩﯨﻨﯩﯔ ﻗﺎﻳﺘﯘﺭﻣﺎ ﻗﯩﻤﻤﻪﺕ ﺗﯩﭙﻰ ﺧﺎﻟﯩﻐﺎﻧﭽﻪ ﺑﻮﻟﺴﺎ ﺑﻮﻟﯩﺪﯗ. ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫62‬ ‫ﻛﻮﺩ 7‬ ‫ )‪        public static float Devide(this int i‬‬ ‫ {        ‬ ‫ ;2 / ‪            return (float)i‬‬ ‫}        ‬ ‫ﺑﯘ ﻣﯧﺘﻮﺩ ‪ int‬ﺗﯩﭙﯩﻐﺎ ﺋﯚﺯ ﻗﯩﻤﻤﯩﺘﯩﻨﯩﯔ ﻳﯧﺮﯨﻤﻰ ﻗﺎﻳﺘﯘﺭﯗﺵ ﺋﯩﻘﺘﯩـﺪﺍﺭﯨﻨﻰ ﻗﻮﺷـﯩﺪﯗ. ﺋﻪﻟـﯟﻩﺗﺘﻪ، ﭘﯜﺗـﯜﻥ‬ ‫ﺳﺎﻧﻨﻰ ﺋﯩﻜﻜﯩﮕﻪ ﺑﯚﻟﺴﻪﻙ ﻛﻪﺳﯩﺮ ﺳﺎﻧﻤﯘ ﭼﯩﻘﯩﺪﯗ. ﺷﯘﯕﺎ ﻗﺎﻳﻤﺎ ﻗﯩﻤﻤﻪﺕ ﺗﯩﭙﯩﻨﻰ ‪ float‬ﻗﯩﻠﺪﯗﻕ.‬ ‫ﺑﯩﺮﺩﺍﻧﻪ ﻛﯧﯖﻪﻳﺘﯩﺶ ﺗﯜﺭﻯ ﺋﯩﭽﯩﮕﻪ ﺑﯩﺮﻗﺎﻧﭽﻪ ﺗﯩﭙﻨﯩﯔ ﻛﯧﯖﻪﻳﺘﯩﺶ ﻣﯧﺘﻮﺩﻟﯩﺮﯨﻨﻰ ﺋﺎﺭﻻﺵ ﻳـﺎﺯﻏﯩﻠﻰ‬ ‫ﺑﻮﻟﯩﺪﯗ. ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫ﻛﻮﺩ 8‬ ‫ ‪   static class MixedExtension‬‬ ‫ {    ‬ ‫ )‪        public static int Increase(this int i‬‬ ‫ {        ‬ ‫ ;1 + ‪            return i‬‬ ‫ }        ‬ ‫ )‪        public static float DoubleIt(this float f‬‬ ‫ {        ‬ ‫ ;‪            return f * f‬‬ ‫ }        ‬ ‫}    ‬ ‫‪int‬ﺗﯩﭙﯩﻨﯩــﯔ ﻛﯧﯖﻪﻳــﺘﯩﺶ ﻣﯧﺘــﻮﺩﻯ )(‪ Increase‬ﺑﯩــﻠﻪﻥ ‪ float‬ﺗﯩﭙﯩﻨﯩــﯔ ﻛﯧﯖﻪﻳــﺘﯩﺶ ﻣﯧﺘــﻮﺩﻯ‬ ‫)(‪ DoubleIt‬ﺑﯩ ـﺮ ﺗ ـﯜﺭ ﺋﯩﭽﯩ ـﮕﻪ ﻳﯧﺰﯨﻠ ـﺪﻯ. ﻛﯧﻴﯩﻨﻜﯩ ـﺴﻰ ﺑﻮﻟ ـﺴﺎ ‪ float‬ﺗﯩﭙﯩﻐ ـﺎ ﺋ ـﯚﺯ ﻗﯩﻤﻤﯩﺘﯩﻨﯩ ـﯔ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ ـ‬ ‫ﻛﯟﺍﺩﺭﺍﺗﯩﻨﻰ ﻗﺎﻳﺘﯘﺭﯗﺵ ﺋﯩﻘﺘﯩﺪﺍﺭﯨﻨﻰ ﻗﻮﺷﯩﺪﯗ.‬ ‫ﻛﯧﯖﻪﻳﺘﯩﺶ ﻣﯧﺘﻮﺩﻯ ﻛﯚﭖ ﭘﺎﺭﺍﻣﯧﺘﯩﺮﻧﻰ ﻗﻮﻟﻼﻳﺪﯗ.‬ ‫ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ ﻳﯘﻗﯩﺮﯨﻘﻰ ﻣﯩﺴﺎﻟﻼﺭﻧﯩﯔ ﮬﻪﻣﻤﯩـﺴﯩﺪﯨﻜﻰ ﺑﯩـﺰ ﻗﻮﺷـﻘﺎﻥ ﻛﯧﯖﻪﻳـﺘﯩﺶ ﻣﯧﺘﻮﺩﻟﯩﺮﯨـﺪﺍ ﺋﻪﻣﻪﻟﯩـﻲ‬ ‫ﭘﺎﺭﺍﻣﯧﺘﯩﺮﻻﺭ ﻳﻮﻕ. ﻣﻪﺳﯩﻠﻪﻥ )(‪ . int j = i.Increase‬ﺑـﯘ ﻗـﯘﺭﺩﺍ )(‪ Increase‬ﻣﯧﺘـﻮﺩﻯ ﺑﯩـﺮ‬ ‫ﺋﯩــﺸﻨﻰ ﻗﯩﻠﯩــﺪﯗ ﺋﻪﻣﻤــﺎ ﺋﯘﻧﯩﯖﻐــﺎ ﭘــﺎﺭﺍﻣﯧﺘﯩﺮ ﻳــﻮﻟﻼﭖ ﺑﻪﺭﻣﯩــﺪﯗﻕ. )(‪ Increase‬ﻣﯧﺘــﻮﺩﻯ ﺋﻪﺳــﻠﻰ‬ ‫ﻗﯩﻤﻤﯩـﺘﯩﮕﻪ ﺑﯩﺮﻧـﻰ ﻗﻮﺷـﯘﭖ ﻗـﺎﺗﯘﺭﯗﭖ ﺑﯧﺮﯨـﺪﯗ. ﺋﻪﮔﻪﺭ ﺑﯩـﺰ ﻣﻪﺯﻛـﯘﺭ ﻣﯧﺘـﻮﺩﺗﯩﻦ ﭘﺎﻳـﺪﯨﻠﯩﻨﯩﭗ ﺋﻪﺳـﻠﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻗﯩﻤﻤﻪﺗﻜﻪ ﺋﯜﭼﻨﻰ ﻗﻮﺷﻘﯘﺯﻣﺎﻗﭽﻰ ﺑﻮﻟﺴﺎﻕ، ﻣﯘﻧﺪﺍﻕ ﻛﻮﺩ ﻳﯧﺰﯨﺸﯩﻤﯩﺰ ﻣﯘﻣﻜﯩﻦ:‬ ‫ﻛﻮﺩ 9‬ ‫ ;5 = ‪ int i‬‬ ‫ 8==‪int j = i.Increase().Increase().Increase();   //j‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫72‬ ‫ﺋﻪﮔﻪﺭ ﺋﺎﺷـﯘﺭﻣﺎﻗﭽﻰ ﺑﻮﻟﻐـﺎﻥ ﻗﯩﻤﻤﻪﺗﻨـﻰ ﭘـﺎﺭﺍﻣﯧﺘﯩﺮ ﺋـﺎﺭﻗﯩﻠﯩﻖ ﻳـﻮﻟﻼﭖ ﺑﻪﺭﺳـﻪﻛﭽﯘ؟ ﺋﻪﻟـﯟﻩﺗﺘﻪ ﺑﻮﻟﯩـﺪﯗ.‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﯘﻧﯩﯔ ﺋﯜﭼﯜﻥ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻛﻮﺩ ﻳﺎﺯﯨﻤﯩﺰ:‬ ‫ﻛﻮﺩ 01‬ ‫ )‪public static int Increase(this int i, int degree‬‬ ‫ {‬ ‫ ;‪return i + degree‬‬ ‫ }‬ ‫ﺑﯩﺮﯨﻨﭽﻰ ﭘﺎﺭﺍﻣﯧﺘﯩﺮﻯ »ﻣﯘﺷﯘ ﺗﯩﭙﻠﯩﻖ ﺋﯚﺯﯛﻡ« ﺩﯦﮕﻪﻥ ﻣﻪﻧﯩﺪﻩ ، ﺋﯩﻜﻜﯩﻨﭽﻰ ﭘﺎﺭﺍﻣﯧﺘﯩﺮ ﺑﯩـﺮ ﺩﺍﻧﻪ ﭘﯜﺗـﯜﻥ‬ ‫ﺳﺎﻥ ﺗﯩﭙﻠﯩﻖ )ﺑﯘ ﻳﻪﺭﺩﯨﻜﻰ ﭘﺎﺭﺍﻣﯧﺘﯩﺮ ﺗﯩﭙﯩﻐﺎ ﭼﻪﻙ ﻳﻮﻕ( ﻗﯩﻤﻤﻪﺕ. ﻗﺎﻳﺘﯘﺭﻣﺎ ﻗﯩﻤـﻤﻪﺕ ﺋﻪﺳـﻠﻰ ﻗﯩﻤـﻤﻪﺕ‬ ‫ﺑﯩ ـﻠﻪﻥ ﺋﯩﻜﻜﯩﻨﭽ ـﻰ ﭘ ـﺎﺭﺍﻣﯧﺘﯩﺮﺩﺍ ﺑﯧ ـﺮﯨﻠﮕﻪﻥ ﻗﯩﻤﻤﻪﺗﻨﯩ ـﯔ ﻳﯩﻐﯩﻨﺪﯨ ـﺴﻰ. ﺋﻪﻣ ـﺪﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﯩ ـﺪﻩﻙ ﻛ ـﻮﺩ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ﻳﺎﺯﺍﻻﻳﻤﯩﺰ.‬ ‫ﻛﻮﺩ 11‬ ‫ ;5 = ‪int i‬‬ ‫ 8 == 3+5  == ‪int j = i.Increase(3);        //j‬‬ ‫ﻳﻪﻧﻪ ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫ﻛﻮﺩ 21‬ ‫ ‪static class MixedExtension‬‬ ‫ {‬ ‫ )‪    public static string ExtendedTrim(this string s, char c‬‬ ‫ {    ‬ ‫ ;)} ‪        return s.Trim(new char[] { c‬‬ ‫ }    ‬ ‫}‬ ‫ﻣﯘﻧﺎﺳﯩﭗ ﺋﯩﺸﻠﯩﺘﯩﺶ:‬ ‫ﻛﻮﺩ 31‬ ‫;"ﻛﯩﺮﺩﯨﻢ ﻳﺎﺷﻘﺎ.............ﻣﻪﻥ" = 1‪string str‬‬ ‫;)'.'(‪string str2 = str1.ExtendedTrim‬‬ ‫"ﻛﯩﺮﺩﯨﻢ ﻣﻪﻧﻴﺎﺷﻘﺎ" == 2‪// str‬‬ ‫ﻳﯩﻐﯩﻨﭽﺎﻗﻠﯩﻐﺎﻧﺪﺍ ﺗﯜﺭ)ﻳﺎﻛﻰ ﺗﯩﭗ(ﻻﺭ ﺋﺎﺭﯨﺴﯩﺪﯨﻜﻰ ﻣﯧﺘﻮﺩ ﻛﯧﯖﻪﻳﺘﯩﺸﻨﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻗﯧﻠﯩﭙﻼﺷﺘﯘﺭﯗﺵ‬ ‫ﻣﯘﻣﻜﯩﻦ:‬ ‫ﻛﻮﺩ 52.2‬ ‫ { ‪public class A‬‬ ‫ }{ )(‪    public virtual void X‬‬ ‫ }‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫82‬ ‫ { ‪public class B : A‬‬ ‫ }{ )(‪    public override void X‬‬ ‫ }{ )(‪    public void Y‬‬ ‫ }‬ ‫ ‬ ‫ { ‪static public class E‬‬ ‫ }{ ) ‪    static void X( this A a‬‬ ‫ }{ ) ‪    static void Y( this A b‬‬ ‫ ‬ ‫ { )(‪    public static void Demo‬‬ ‫ ;)(‪        A a = new A‬‬ ‫ ;)(‪        B b = new B‬‬ ‫ ;)(‪        A c = new B‬‬ ‫‪ A.X‬ﻧﻰ ﭼﺎﻗﯩﺮﯨﺶ // ;)(‪ a.X‬‬ ‫‪ B.X‬ﻧﻰ ﭼﺎﻗﯩﺮﯨﺶ // ;)(‪b.X‬‬ ‫‪ B.X‬ﻧﻰ ﭼﺎﻗﯩﺮﯨﺶ // ;)(‪c.X‬‬ ‫‪ E.Y‬ﻧﻰ ﭼﺎﻗﯩﺮﯨﺶ // ;)(‪a.Y‬‬ ‫‪ B.Y‬ﻧﻰ ﭼﺎﻗﯩﺮﯨﺶ // ;)(‪b.Y‬‬ ‫‪ E.Y‬ﻧﻰ ﭼﺎﻗﯩﺮﯨﺶ // ;)(‪c.Y‬‬ ‫}‬ ‫}‬ ‫ﺋﻮﺑﻴﯧﻜﺘﻼﺭﻧﻰ ﺩﻩﺳﻠﻪﭘﻠﻪﺷﺘﯜﺭﯛﺵ ﺋﯩﭙﺎﺩﯨﺴﻰ‬ ‫‪ C#1.x‬ﺩﻩ ﺧﺎﺳـــﻠﯩﻘﻼﺭﻧﻰ ﻳـــﺎﻛﻰ ﻳﻪﺭﻟﯩـــﻚ ﺋﯚﺯﮔﻪﺭﮔـــﯜﭼﻰ ﻣﯩﻘـــﺪﺍﺭﻻﺭﻧﻰ ﺑﯩـــﺮ ﺟـــﯜﻣﻠﻪ ﺋـــﺎﺭﻗﯩﻠﯩﻘﻼ‬ ‫ﺩﻩﺳﻠﻪﭘﻠﻪﺷﺘﯜﺭﯛﺷﻜﻪ ﺑﻮﻟﯩﺪﯗ.‬ ‫ ;3 = ‪int i‬‬ ‫ ;'‪string name = 'Unknown‬‬ ‫ ;) 23 ,"‪Customer c = new Customer( "Tom‬‬ ‫ﺑﯘﻧـــﺪﺍﻕ ﺩﻩﺳﻠﻪﭘﻠﻪﺷـــﺘﯜﺭﯛﺵ ﺋﯘﺳـــﯘﻟﯩﻐﺎ ﭼﺎﻗﯩﺮﯨﻠﻤـــﺎ ﺗﯩﭙﻘـــﺎ)‪ (引用类型‬ﻗﻮﻟﻠﯩﻨﯩﻠﻐﺎﻧـــﺪﺍ ﺋﺎﻟـــﺪﯨﻦ‬ ‫ﺑﻪﻟﮕﯩﻠﻪﻧــﮕﻪﻥ ﻣــﺎﺱ ﮬﺎﻟــﺪﯨﻜﻰ ﻗﯘﺭﻏــﯘﭼﻰ ﻣﯧﺘــﻮﺩﻟﯩﺮﯨﻨﻰ ﺋﯩﺠــﺮﺍ ﻗﯩﻠﯩــﺪﯗ. ﻳــﯘﻗﯩﺮﯨﻘﻰ ﺋــﯜﭼﯩﻨﭽﻰ ﻗــﯘﺭ‬ ‫ﺋﯜﻧﯜﻣﻠﯜﻙ ﺑﻮﻟﯘﺷﻰ ﺋﯜﭼﯜﻥ ﭼﻮﻗﯘﻡ ‪ Customer‬ﺗﯜﺭﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻳﯧﺰﯨﻠﻐﺎﻥ ﺑﻮﻟﯘﺷﻰ ﻛﯧﺮﻩﻙ.‬ ‫ { ‪public class Customer‬‬ ‫ ;‪    public int Age‬‬ ‫ ;‪    public string Name‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫92‬ ‫ ;‪    public string Country‬‬ ‫ { ) ‪    public Customer( string name, int age‬‬ ‫ ;‪        this.Name = name‬‬ ‫ ;‪        this.Age = age‬‬ ‫ }    ‬ ‫ … //    ‬ ‫ }‬ ‫ﺩﯦـﻤﻪﻙ ﺋـﯘ )  23  ,"‪ new  Customer(  "Tom‬ﺩﻩﻙ ﺋﯩﺸﻠﯩﺘﯩـﺸﻜﻪ ﻣﯘﻧﺎﺳـﯩﭗ ﻗﯘﺭﻏـﯘﭼﻰ ﻣﯧﺘـﻮﺩﻧﻰ‬ ‫ﺗﻪﻳﻴﺎﺭﻟﯩﺸﻰ ﻛﯧﺮﻩﻙ. ﺑﯩﺮﺍﻕ ﺑﯘ ﻗﯘﺭﻏﯘﭼﯩﻨﯩﯔ ﺑﯩﺮ ﺋﺎﺟﯩﺰﻟﯩﻘﻰ ﺑﺎﺭ ﻳﻪﻧﻰ: ﻗﯘﺭﻏﺎﻥ ﭘﻪﻳﺘﺘﻪ ‪ name‬ﺑﯩﻠﻪﻥ‬ ‫‪age‬ﻧـﻰ ﭼﻮﻗـﯘﻡ ﻳـﻮﻟﻼﭖ ﺑﯧﺮﯨـﺸﯩﻤﯩﺰ ﻛﯧـﺮﻩﻙ. ﺋﻪﮔﻪﺭ ‪ Country‬ﺑﯩـﻠﻪﻥ ‪ name‬ﻻ ﺑﻮﻟﻐـﺎﻥ، ‪ age‬ﺋـﻰ‬ ‫ﻗﯘﺭﯗﻕ ﺑﻮﻟﻐﯩﻨﯩﻨﻰ ﻗﯘﺭﯗﺵ ﺋﯜﭼﯜﻥ ﻳﺎﻛﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻛـﻮﺩ ﻳﯧـﺰﯨﺶ ، ﻳـﺎﻛﻰ ﻣﯘﻧﺎﺳـﯩﭗ ﻗﯘﺭﻏـﯘﭼﻰ‬ ‫ﻣﯧﺘﻮﺩﯨﻨﻰ ﺗﻪﻣﯩﻨﻠﻪﺵ ﻛﯧﺮﻩﻙ.‬ ‫ﻛﻮﺩ 72.2‬ ‫ ;)(‪Customer customer = new Customer‬‬ ‫ ;"‪customer.Name = "Marco‬‬ ‫ ;"‪customer.Country = "Italy‬‬ ‫0.3#‪ C‬ﺩﻩ ﻳﯘﻗﯩﺮﯨﻘﯩــﺪﻩﻙ ﻣﻪﺷــﻐﯘﻻﺗﻼﺭﻧﻰ ﺗﯧﺨﯩﻤــﯘ ﺋــﺎﺩﺩﻯ)ﻗﯩــﺴﻘﺎ( ﺟــﯜﻣﻠﯩﻠﻪﺭ ﺋــﺎﺭﻗﯩﻠﯩﻖ ﺋﻪﻣﻪﻟــﮕﻪ‬ ‫ﺋﺎﺷﯘﺭﻏﯩﻠﻰ ﺑﻮﻟﯩﺪﯗ. ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫ﻛﻮﺩ 82.2‬ ‫ﺋﻮﺑﻴﯧﻜﺘﻨﻰ ﺩﻩﺳﻠﻪﭘﻠﻪﺷﺘﯜﺭﯛﺷﺘﯩﻦ ﺋﺎﯞﺍﻝ ﺗﯜﺭﻧﯩﯔ ﻛﯚﯕﯜﻟﺪﯨﻜﻰ ﻗﯘﺭﻏﯘﭼﻰ ﻣﯧﺘﻮﺩﯨﻨﻰ ﻳﻮﺷﯘﺭﯗﻥ ﮬﺎﻟﺪﺍ ﭼﺎﻗﯩﺮﯨﺪﯗ //‬ ‫ = ‪Customer customer = new Customer { Name = "Marco", Country‬‬ ‫ ;} "‪"Italy‬‬ ‫ﺋﻮﺑﻴﯧﻜﺘﻨﻰ ﺩﻩﺳﻠﻪﭘﻠﻪﺷﺘﯜﺭﯛﺷﺘﯩﻦ ﺋﺎﯞﺍﻝ ﺗﯜﺭﻧﯩﯔ ﻛﯚﯕﯜﻟﺪﯨﻜﻰ ﻗﯘﺭﻏﯘﭼﻰ ﻣﯧﺘﻮﺩﯨﻨﻰ ﺋﺎﺷﻜﺎﺭﻩ ﮬﺎﻟﺪﺍ ﭼﺎﻗﯩﺮﯨﺪﯗ //‬ ‫ = ‪Customer customer = new Customer() { Name = "Marco", Country‬‬ ‫ ;} "‪"Italy‬‬ ‫ﻟﯧﻜﯩﻦ ﺋﺎﻟﺪﯨﻨﻘﻰ ﺷﻪﺭﺕ ﺷﯘﻛﻰ ﺗﯩﺮﻧﺎﻕ ﺋﯩﭽﯩﺪﯨﻜﻰ ﺧﺎﺳﻠﯩﻘﻼﺭ ﭼﻮﻗﯘﻡ ‪ public‬ﺑﻮﻟﯘﺷﻰ ﻛﯧﺮﻩﻙ.‬ ‫ﺋﻪﮔﻪﺭ ﺗﯜﺭ ﻣﻪﻟـﯘﻡ ﭘـﺎﺭﺍﻣﯧﺘﯩﺮﻟﯩﻖ ﻗﯘﺭﻏـﯘﭼﻰ ﻣﯧﺘـﻮﺩﻻﺭﻧﻰ ﺗﻪﻣﯩـﻨﻠﯩﮕﻪﻥ ﺑﻮﻟـﺴﺎ، ﻳـﯘﻗﯩﺮﯨﻘﻰ ﺟـﯜﻣﻠﯩﻠﻪﺭﻧﻰ‬ ‫ﻗﯘﺭﻏﯘﭼﻰ ﻣﯧﺘﻮﺩﻯ ﺋﺎﺳﺎﺳﯩﺪﺍ ﻳﺎﺯﻏﯩﻠﻰ ﺑﻮﻟﯩﺪﯗ. ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫ﻛﻮﺩ 92.2‬ ‫ﻛﯚﯕﯜﻟﺪﯨﻜﻰ ﺋﻪﻣﻪﺱ ﻗﯘﺭﻏﯘﭼﻰ ﻣﯧﺘﻮﺩﯨﻨﻰ ﺋﺎﺷﻜﺎﺭﻩ ﮬﺎﻟﺪﺍ ﭼﺎﻗﯩﺮﯨﺪﯗ //‬ ‫ ;} "‪Customer c2 = new Customer( "Paolo", 21 ) { Country = "Italy‬‬ ‫2‪c‬ﻧﯩﯔ ﻳﯘﻗﯩﺮﯨﻘﻰ ﺋﯧﻨﯩﻘﻠﯩﻤﯩﺴﻰ ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ ﺗﯚﯞﻩﻧﻜﻰ ﺋﯩﻜﻜﻰ ﺟﯜﻣﻠﻪ ﺑﯩﻠﻪﻥ ﺑﺎﺭﺍﯞﻩﺭ‬ ‫ ;) 12 ,"‪Customer c2 = new Customer( "Paolo‬‬ ‫;"‪c2.Country = "Italy‬‬ www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 30 ‫ﺑﯘ ﻗﺎﺋﯩﺪﻩ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻣﻪﺳﯩﻠﯩﻠﻪﺭﺩﻩ ﺗﯧﺨﯩﻤﯘ ﻛﯜﭼﯩﻨﻰ ﻛﯚﺭﺳﯩﺘﯩﺪﯗ. ﻣﻪﺳﯩﻠﻪﻥ: ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ‬ ‫ﻣﯘﻧﺎﺳﯩﯟﻩﺗﻠﯩﻚ ﺋﯩﻜﻜﻰ ﺗﯜﺭ ﺑﺎﺭ‬ 2.30 ‫ﻛﻮﺩ‬ public class Point {      int x, y;      public int X { get { return x; } set { x = value; } }      public int Y { get { return y; } set { y = value; } }  }    public class Rectangle {      Point tl, br;      public Point TL { get { return tl; } set { tl = value; } }      public Point BR { get { return br; } set { br = value; } }  }  ‫ ﺗﯜﺭﯨﺪﯨﻦ ﺑﯩﺮ ﺋﯧﻨﯩﻘﻼﺵ ﯞﻩ ﻗﯩﻤﻤﻪﺗﻠﯩﺮﯨﻨﻰ ﺗﻮﻟـﺪﯗﺭﯗﺵ‬Rectangle ‫ ﯞﻩ ﺑﯘﺭﯗﻧﻘﻰ ﻧﻪﺷﯩﺮﻟﯩﺮﯨﺪﻩ‬C#2.0 (‫ﺋﯜﭼﯜﻥ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﺟﻪﺭﻳﺎﻥ ﻛﯧﺘﻪﺗﺘﻰ)ﺋﻪﻟﯟﻩﺗﺘﻪ، ﺑﯘﻣﯘ ﺑﯩﺮ ﺧﯩﻞ ﻳﻮﻟﻰ‬ Rectangle rectangle2 = new Rectangle();  Point point1 = new Point();  point1.X = 0;  point1.Y = 1;  rectangle2.TL = point1;  Point point2 = new Point();  point2.X = 2;  point2.Y = 3;  rectangle2.BR = point2;  Rectangle rectangle1 = rectangle2;  ‫ ﻧﯩـﯔ ﻗﺎﺋﯩﺪﯨـﺴﯩﻨﻰ ﻗﻮﻟﻼﻧـﺴﺎﻕ، ﺗﯚﯞﻩﻧـﺪﯨﻜﻰ ﺑﯩـﺮ-ﻗـﺎﻧﭽﻪ ﻗـﯘﺭ ﺋـﺎﺭﻗﯩﻠﯩﻘﻼ ﻣﻪﻗـﺴﻪﺗﻜﻪ‬C#3.0 ‫ﺋﻪﮔﻪﺭ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻳﯧﺘﻪﻟﻪﻳﻤﯩﺰ‬ 2.31 ‫ﻛﻮﺩ‬ Rectangle r = new Rectangle {      TL = new Point { X = 0, Y = 1 },      BR = new Point { X = 2, Y = 3 }  };  ‫ﻳﺎﻛﻰ‬ Rectangle r = new Rectangle {  ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫13‬ ‫ ,} 1 = ‪    TL = { X = 0, Y‬‬ ‫ } 3 = ‪    BR = { X = 2, Y‬‬ ‫ ;}‬ ‫ﺋﻪﮔﻪﺭ ﻗﯘﺭﻣﺎﻗﭽﻰ ﺑﻮﻟﻐﯩﻨﯩﯖﯩﺰ ﻣﻪﻟﯘﻡ ﺗﯜﺭﻧﯩﯔ ﺗﯩﺰﯨﻤﻠﯩﻜﻰ ﺑﻮﻟﺴﺎ ﻳﯘﻗﯩﺮﯨﻘﻰ ﻗﺎﺋﯩﺪﻩ ﻳﻪﻧﯩﻼ ﻛﯜﭼﻜﻪ ﺋﯩﮕﻪ:‬ ‫ﻛﻮﺩ 23.2‬ ‫ ;} 81 ,9 ,3 ,1 { >‪List integers = new List‪List list = new List ‪    where c.Discount‬‬ ‫ ‪    orderby c.Discount‬‬ ‫ ;} 001 / ‪    select new { c.Name, Perc = c.Discount‬‬ ‫ ‬ ‫ { ) ‪foreach( var x in query‬‬ ‫ ;) ‪    Console.WriteLine( x‬‬ ‫ }‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫43‬ ‫ﮬﻪﺭﺑﯩﺮ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ‪ from‬ﺧﺎﺱ ﺳﯚﺯﯨﺪﯨﻦ ﺑﺎﺷﻠﯩﻨﯩﭗ)ﭼﻮﯓ- ﻛﯩﭽﯩﻚ ﮬﻪﺭﭘﻜﻪ ﺳﻪﺯﮔﯜﺭ(‬ ‫ﻳﺎ ‪ select‬ﻳﺎ ‪ group‬ﺧﺎﺱ ﺳـﯚﺯﻯ ﺑﯩـﻠﻪﻥ ﺋﺎﺧﯩﺮﻟﯩـﺸﯩﺪﯗ. ‪ from‬ﺧـﺎﺱ ﺳـﯚﺯﻯ ‪ Linq‬ﻣﻪﺷـﻐﯘﻻﺗﻰ‬ ‫ﺋﯧﻠﯩﭗ ﺑﯧﺮﯨﻠﻤﺎﻗﭽﻰ ﺑﻮﻟﻐﺎﻥ ﮬﻪﻣﺪﻩ >‪ IEnumerable‪ IEnumerable ‪            .Where( c => c.Discount‬‬ ‫ ) ‪            .OrderBy( c => c.Discount‬‬ ‫ ;) } 001 / ‪            .Select( c=> new { c.Name, Perc = c.Discount‬‬ ‫ﮬﻪﺭﺑﯩﺮ ﺋﯩﭙﺎﺩﻩ ﺧﺎﺱ ﺳﯚﺯﻯ)ﻣﻪﺳﯩﻠﻪﻥ: ‪ (select‬ﻣﻪﻟﯘﻡ ﻛﯚﭘﻤﺎﺱ ﻣﯧﺘﻮﺩﻗﺎ)‪ (generic method‬ﺑﺎﺭﺍﯞﻩﺭ.‬ ‫ﺑﯘﻻﺭﺩﯨﻦ ﺷﯘﻧﻰ ﮬﯧﺲ ﻗﯩﻼﻻﻳﻤﯩﺰﻛﻰ، ﺑﯩﺰ ﻳﯘﻗﯩﺮﯨﺪﺍ ﺳﯚﺯﻟﯩﮕﻪﻥ ﺑﺎﺭﻟﯩﻖ ﻳﯧﯖﻰ ﻗﺎﺋﯩﺪﯨﻠﻪﺭ ﺋﻪﯓ ﺋﺎﺧﯩﺮﯨﺪﺍ‬ ‫‪ Linq‬ﻏﺎ ﺑﯧﺮﯨﭗ ﺗﺎﻗﯩﺸﯩﺪﯗ. ﻳﻪﻧﻰ ‪ var‬ﺑﻮﻟﺴﺎ ‪ query‬ﻧﻪﺗﯩﺠﯩـﺴﯩﻨﻰ ﺋﯧﻨﯩﻘﻼﺷـﻘﺎ، ﻧﺎﻣـﺴﯩﺰ ﺗﯩـﭗ ﺑﻮﻟـﺴﺎ‬ ‫‪ query‬ﻧﻪﺗﯩﺠﯩــــﺴﯩﻨﻰ ﺳﺎﻗﻼﺷــــﻘﺎ. ‪ from ،Select‬ﻣﻪﺷــــﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺑﻮﻟــــﺴﺎ ﻣﯘﻧﺎﺳــــﯩﭗ ‪Linq‬‬ ‫ﻣﯩﺰﻭﺗﻠﯩﺮﯨﻨﯩﯔ ﺋﻮﺭﻧﯩﻐﺎ ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺪﯗ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫53‬ ‫‪ Linq‬ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩﺴﯩﺪﯨﻦ ﺋﺎﺳﺎﺱ‬ ‫ﺗﯚﺗﯩﻨﭽﻰ ﺑﺎﺏ‬ ‫ﺯﺍﻣﺎﻧﯩﯟﻯ ﭘﺮﻭﮔﺮﺍﻣﻤﺎ ﺗﯩﻠﻰ ﯞﻩ ﻳﯘﻣـﺸﺎﻕ ﺩﯦﺘـﺎﻟﻼﺭ ﺋﺎﺳﺎﺳـﻪﻥ ﺩﯦﮕﯩـﺪﻩﻙ ﺋﻮﺑﻴﯧﻜﺘﻘـﺎ ﻳـﯜﺯﻟﻪﻧﮕﻪﻥ ﻗﯘﺭﯗﻟﻤـﺎ‬ ‫ﺗﻪﺭﻩﭘـﺪﺍﺭﻯ ﺑﻮﻟﯘﯞﺍﺗﯩـﺪﯗ. ﻧﻪﺗﯩﺠﯩـﺪﻩ ﺑﯩﺰﻧﯩـﯔ ﻛـﯚﭖ ﻗﯩـﺴﯩﻢ ﻣﻪﺷـﻐﯘﻻﺗﻠﯩﺮﯨﻤﯩﺰ ﺟﻪﺩﯞﻩﻝ ﯞﻩ ﺭﯦﻜـﻮﺭﺗﻼﺭ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﯩﻠﻪﻥ ﺋﻪﻣﻪﺱ ﺑﻪﻟﻜﻰ ﺋﻮﺑﻴﯧﻜﺖ ﺗﻮﭘﻼﻣﻠﯩﺮﻯ ﯞﻩ ﺋﯘﻻﺭﻧﯩﯔ ﺋﻪﺯﺍﻟﯩﺮﻯ ﺑﯩـﻠﻪﻥ ﮬﻪﭘﯩﻠﯩـﺸﯩﺶ ﺑﻮﻟﯩﯟﺍﺗﯩـﺪﯗ.‬ ‫ﺷــﯘ ﺳــﻪﯞﻩﺑﻠﯩﻚ ﭘﺮﻭﮔﺮﺍﻣﻤــﺎ ﺗﯩﻠﻠﯩــﺮﻯ ﺋﺎﻣــﺎﻝ ﺑــﺎﺭ ﻣــﯘﻗﯩﻢ ﺳــﺎﻥ ﻣﻪﻧﺒﻪﻟﯩﺮﯨﻨــﻰ)ﻣﻪﺳــﯩﻠﻪﻥ: ﺳــﺎﻧﺪﺍﻥ(‬ ‫ﭘﺮﻭﮔﺮﺍﻣﻤﯧــﺮﺩﯨﻦ ﺋــﺎﻳﺮﯨﺶ ﻳــﻮﻟﻠﯩﺮﻯ ﺋﯜﺳــﺘﯩﺪﻩ ﺋﯩﺰﺩﯨﻨﯩﯟﺍﺗﯩــﺪﯗ. ﺗﯩﻠﻐــﺎ ﺋﻮﺭﻧﯩﺘﯩﻠﻐــﺎﻥ ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻙ‬ ‫)‪ (Language Integrated Query‬ﻳﻪﻧـﻰ ﺋﺎﺗـﺎﻟﻤﯩﺶ ‪ Linq‬ﭘﺮﻭﮔﺮﺍﻣﻤﯧﺮﻻﺭﻧـﻰ ﺗﺎﺭﻣـﺎﻗﭽﯩﻼﺭ ﺗﯩﺰﻣﯩـﺴﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫)ﻳﻪﻧﻰ ﺋﻮﺑﻴﯧﻜﺘﻼﺭ ‪ ،objects‬ﮔﻪﯞﺩﯨﻠﻪﺭ ‪ ،entities‬ﺳﺎﻧﺪﺍﻥ ﺭﯦﻜـﻮﺭﺗﻠﯩﺮﻯ ‪XML ،database records‬‬ ‫ﻧﯘﻗﺘﯩﻠﯩﺮﻯ ﻗﺎﺗـﺎﺭﻟﯩﻘﻼﺭ( ﻏـﺎ ﻧﯩـﺴﺒﻪﺗﻪﻥ ﺋﯜﻧﯜﻣﻠـﯜﻙ ﻣﻪﺷـﻐﯘﻻﺕ ﻗﯩﻠﯩـﺶ ﭼﺎﺭﯨـﺴﻰ ﺑﯩـﻠﻪﻥ ﺗﻪﻣﯩﻨﻠﻪﻳـﺪﯗ.‬ ‫ﺋﯘﻧﯩﯔ ﺋﻪﯓ ﺋﯘﺗﯘﻗﻠﯘﻕ ﻳﯧﺮﻯ ﺷﯘﻛﻰ ﺋـﯘ ﺗﯩﺰﻣﯩﻼﺭﻏـﺎ )ﺳـﺎﻧﺪﺍﻧﻤﯘ ﺷـﯘ( ﻻﺭﻏـﺎ ﺑﻮﻟﻐـﺎﻥ ﻣﻪﺷـﻐﯘﻻﺗﯩﯖﯩﺰﻧﻰ‬ ‫ﭘﺮﻭﮔﺮﺍﻣﻤ ـﺎ ﺗﯩﻠ ـﻰ ﺑﯩ ـﻠﻪﻥ ﻳﯜﻛ ـﺴﻪﻙ ﺩﻩﺭﯨﺠﯩ ـﺪﻩ ﻳﯧﻘﯩﻨﻼﺷ ـﺘﯘﺭﻏﺎﻥ ﺑﻮﻟ ـﯘﭖ ﭘﺮﻭﮔﺮﺍﻣﻤ ـﺎ ﺗﯩﻠﯩﻨﯩ ـﯔ ﺋ ـﺎﺩﺩﻯ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻗﺎﺋﯩــﺪﯨﻠﯩﺮﻯ ﺋــﺎﺭﻗﯩﻠﯩﻖ ﻣــﯘﺭﻩﻛﻜﻪﭖ ﻣﻪﺷــﻐﯘﻻﺗﻼﺭﻧﻰ)ﻣﻪﺳــﯩﻠﻪﻥ ﺳــﺎﻧﺪﺍﻥ ﻣﻪﺷــﻐﯘﻻﺗﻠﯩﺮﻯ( ﺋﯩﻠﯩــﭗ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﺎﺭﺍﻻﻳﺴﯩﺰ.‬ ‫‪ LINQ‬ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﻠﯩﺮﻯ )‪(LINQ Queries‬‬ ‫‪ LINQ‬ﺑﯩـــﺮ ﻗﯩـــﺴﯩﻢ ﺳﯜﺭﯛﺷـــﺘﯜﺭﯛﻙ ﺋﻪﻣﻪﻟﻠﯩﺮﯨﻨـــﻰ ﺋﺎﺳـــﺎﺱ ﻗﯩﻠﯩـــﺪﯨﻐﺎﻥ ﺑﻮﻟـــﯘﭖ، ﺋﺎﺳﺎﺳـــﻠﯩﻘﻰ‬ ‫>‪ IEnumerable developersUsingCsharp‬‬ ‫ ‪            from   d in developers‬‬ ‫ "#‪            where  d.Language == "C‬‬ ‫ ;‪            select d.Name‬‬ ‫ ‬ ‫ { )‪        foreach (string item in developersUsingCsharp‬‬ ‫ ;)‪            Console.WriteLine(item‬‬ ‫ }        ‬ ‫ }    ‬ ‫}‬ ‫ﻣﻪﺯﻛﯘﺭ ﻛﻮﺩ ﺳﯜﺯﯛﭖ ﭼﯩﻘﻘﺎﻥ ﭘﺮﻭﮔﺮﺍﻣﻤﯧﺮﻻﺭ ‪ Paolo‬ﺑﯩﻠﻪﻥ ‪.Marco‬‬ ‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺟﯜﻣﻠﯩﻠﯩﺮﻯ ﻗﺎﺭﯨﻤﺎﻗﻘﺎ ‪ Sql‬ﺟﯜﻣﻠﯩﺴﯩﮕﻪ ﺋﯩﻨﺘﺎﻳﯩﻦ ﺋﻮﺧﺸﯩﺸﯩﭗ ﻛﯧﺘﯩـﺪﯗ. ﺑﯩـﺮﺍﻕ‬ ‫ﺋﻪﻣﻪﺱ. ﺋﯘﻧﯩﯖﻐﺎ ﻣﯘﻧﺪﺍﻕ ﺋﯧﻨﯩﻘﻠﯩﻤﺎ ﺑﯧﺮﯨﻠﮕﻪﻥ:‬ ‫ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ﺑﻮﻟﺴﺎ ﺑﯩﺮ ﺧﯩـﻞ ﺩﻩﺭﻩﺧـﺴﯩﻤﺎﻥ ﺋﯩﭙـﺎﺩﻩ ﺑﻮﻟـﯘﭖ ﺑﯩـﺮ ﻳـﺎﻛﻰ ﺑﯩﺮﻗـﺎﻧﭽﻪ ﺋﯘﭼـﯘﺭ‬ ‫ﻣﻪﻧﺒﻪﺳﯩﮕﻪ ﺑﯩﺮ ﻳﺎﻛﻰ ﺑﯩﺮﻗﺎﻧﭽﻪ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﻪﻣﯩﻠﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻣﻪﺷﻐﯘﻻﺕ ﺋﯧﻠﯩﭗ ﺑﺎﺭﯨﺪﯗ.‬ ‫ﺋﺎﺩﻩﺗﺘﻪ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﻧﻪﺗﯩﺠﯩﺴﻰ ﺑﯩﺮ ﺗﻮﭘﻼﻡ ﻗﯩﻤﻤﻪﺗـﻠﻪﺭ ﺗﯩﺰﻣﯩـﺴﯩﺪﯨﻦ ﺋﯩﺒـﺎﺭﻩﺕ ﺑﻮﻟـﯘﭖ ﻗﯩﻤﻤﻪﺗـﻠﻪﺭﮔﻪ‬ ‫ﭼﯧﻘﯩﻠﯩﺶ ﻳﯜﺯ ﺑﻪﺭﮔﻪﻧﺪﯨﻼ ﺋﺎﻧﺪﯨﻦ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﮬﻪﻗﯩﻘﻰ ﺋﯩﺠﺮﺍ ﺑﻮﻟﯩﺪﯗ.‬ ‫ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ‪ select‬ﻳﻪﻧﻰ ﺗﺎﻟﻼﺵ ﻛﻮﻣﺎﻧﺪﯨﺴﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺑﯧﻜﯩﺘﯩﻠﯩـﭗ )‪(select d.Name‬‬ ‫‪ from‬ﻛﻮﻣﺎﻧﺪﯨﺴﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺗﻮﭘﻼﻣﻐـﺎ ﺋﻪﻣﻪﻟﯩﻠﻪﺷـﺘﯜﺭﯛﻟﯩﺪﯗ )‪ .(from d as developers‬ﺑـﯘ ﺗـﺎﻟﻼﺵ‬ ‫ﻣﻪﺷﻐﯘﻻﺗﯩﻨﻰ ‪ where‬ﻏﺎ ﻳﺎﻧﺪﺍﺷﻘﺎﻥ ﺳﯜﺯﯛﺵ ﺷﻪﺭﺗﯩﮕﻪ ﺑﻮﻱ ﺳﯘﻧﯩﺪﯗ. ﻳﻪﻧﻰ‬ ‫"#‪where d.Language == "C‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫73‬ ‫ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ ﻛﻮﺩ-ﺗﻪﺭﺟﯩـﻤﻪ ﻗﯩﻠﯩـﺶ ﻣﻪﺯﮔﯩﻠﯩـﺪﻩ ‪ where‬ﺋﯩﭙﺎﺩﯨـﺴﻰ ‪ System.Linq‬ﻧـﺎﻡ ﺑﻮﺷـﻠﯩﻘﯩﺪﺍ‬ ‫ﺋﯧﻨﯩﻘﻼﻧﻐﺎﻥ ‪ Enumerable‬ﺗﯜﺭﯨﻨﯩﯔ ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪ ﻣﯧﺘﻮﺩﻯ ‪ Where‬ﻏﺎ ﺋﯚﺯﻟﻪﺷﺘﯜﺭﯛﻟﯩﺪﯗ.‬ ‫‪ System.Linq‬ﻧـــﺎﻡ ﺑﻮﺷـــﻠﯩﻘﯩﺪﺍ >‪ IEnumerable expr‬‬ ‫ ‪    developers‬‬ ‫ )"#‪    .Where(d => d.Language == "C‬‬ ‫ ;)‪    .Select(d => d.Name‬‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﯘﻧﯩﯖ ـﺪﯨﻜﻰ ‪ Where‬ﻣﯧﺘ ـﻮﺩﻯ ﺑﯩ ـﻠﻪﻥ ‪ Select‬ﻣﯧﺘﻮﺩﯨﻨﯩ ـﯔ ﮬﻪﺭ ﺋﯩﻜﻜﯩﻠﯩ ـﺴﻰ ‪ Lambda‬ﺋﯩﭙﺎﺩﯨ ـﺴﯩﻨﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋــﯚﺯﯨﮕﻪ ﭘــﺎﺭﺍﻣﯧﺘﯩﺮ ﻗﯩﻠﯩــﺪﯗ ] ﻣﻪﺳــﯩﻠﻪﻥ: )"#‪ .[ (d => d.Language == "C‬ﺑــﯘ ‪Lambda‬‬ ‫ﺋﯩﭙ ـﺎﺩﯨﻠﯩﺮﻯ ﺋﺎﺧﯩﺮﯨ ـﺪﺍ ‪ System.Linq‬ﻧ ـﺎﻡ ﺑﻮﺷ ـﻠﯘﻗﯩﺪﺍ ﺋﺎﻟ ـﺪﯨﻦ ﺑﻪﻟﮕﯩﻠﻪﻧ ـﮕﻪﻥ ﻛﯚﭘﻤ ـﺎﺱ ﻣ ـﯘﯞﻩﻗﻘﻪﺕ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺗﯩﭙﻠﯩﺮﯨﻐﺎ ﺗﻪﺭﺟﯩﻤﻪ ﻗﯩﻠﯩﻨﯩﺪﯗ. ﺗﯚﯞﻩﻧـﺪﯨﻜﯩﻠﯩﺮﻯ ﺑﯧﻜﯩـﺘﻠﮕﻪﻥ ﻛﯚﭘﻤـﺎﺱ ﻣـﯘﯞﻩﻗﻘﻪﺕ ﺗﯩﭙﻠﯩﺮﻧﯩـﯔ ﺗﻮﻟـﯘﻕ‬ ‫ﺗﻮﭘﻠﯩﻤﻰ:‬ ‫ ;)(> ‪public delegate T Func< T‬‬ ‫ ;) 0‪public delegate T Func< A0, T >( A0 arg‬‬ ‫ ;) 1‪public delegate T Func< A0, A1, T > ( A0 arg0, A1 arg‬‬ ‫ ‪public‬‬ ‫ <‪delegate  Func‬‬ ‫ ‪T‬‬ ‫ ,0‪A‬‬ ‫ ,1‪A‬‬ ‫ 2‪A2,  >(  arg0,  arg1,  arg‬‬ ‫ 0‪T  A‬‬ ‫ 1‪A‬‬ ‫ 2‪A‬‬ ‫ ;)‬ ‫ ,2‪public delegate T Func< A0, A1, A3, T > ( A0 arg0, A1 arg1, A2 arg‬‬ ‫;) 3‪A3 arg‬‬ ‫‪ Enumerable‬ﺗﯜﺭﻧﯩﯔ ﻛﯚﭖ ﻗﯩﺴﯩﻢ ﻛﯧﯖﻪﻳـﺘﻤﻪ ﻣﯧﺘـﻮﺩﻟﯩﺮﻯ ﻳـﯘﻗﯩﺮﯨﻘﻰ ﻣـﯘﯞﻩﻗﻘﻪﺕ ﺗﯩﭙﻼﺭﻧـﻰ ﭘـﺎﺭﺍﻣﯧﺘﯩﺮ‬ ‫ﺳ ـﯜﭘﯩﺘﯩﺪﻩ ﻗﻮﺑ ـﯘﻝ ﻗﯩﻼﻻﻳ ـﺪﯗ. ﻣﻪﺳ ـﯩﻠﻪﻥ: ﺗﯚﯞﻩﻧ ـﺪﯨﻜﻰ ﻛﻮﺩﺗﯩﻜﯩ ـﺪﻩﻙ ﻗ ـﻮﻟﻠﯩﻨﯩﺶ ﻳ ـﯘﻗﯩﺮﯨﻘﻰ ﺑ ـﺎﺭﻟﯩﻖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﯩﭙﺎﺩﯨﻠﻪﺭﻧﯩﯔ ﺋﻪﯓ ﺋﺎﺧﯩﺮﯨﻘﻰ ﺋﯚﺯﻟﻪﺷﺘﯜﺭﯛﻟﻤﯩﺴﯩﺪﯗﺭ.‬ ‫ﻛﻮﺩ 2.4‬ ‫ ==  ‪Func  filteringPredicate  =  d  =>  d.Language‬‬ ‫ ;"#‪"C‬‬ ‫ ;‪Func selectionPredicate = d => d.Name‬‬ ‫ = ‪IEnumerable expr‬‬ ‫ ‪    developers‬‬ ‫ )‪    .Where(filteringPredicate‬‬ ‫ ;)‪    .Select(selectionPredicate‬‬ ‫0.3#‪ C‬ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤﺎﻧﻰ ﻳﯘﻗﯩﺮﯨﻘﻰ ﮬﺎﻟﻪﺗﻜﻪ ﻗﺎﻧﺪﺍﻕ ﻛﻪﻟﺘﯜﺭﯛﺷﻨﻰ ﺑﯩﻠﯩﺪﯗ. ﺋﻪﻟﯟﻩﺗﺘﻪ ﺋﻪﮔﻪﺭ ﺳﯩﺰ ‪Linq‬‬ ‫ﺑﯩﻠﯩﻤﻠﯩﺮﯨﻨﻰ ﭘﯩﺸﺸﯩﻖ ﺑﯩﻠﯩﭗ ﺑﻮﻟﻐﺎﻧﺪﯨﻦ ﻛﯧﻴﯩﻦ ﺑﯩﯟﺍﺳﺘﻪ ﻣﯘﺷﯘ ﺧﯩﻞ ﮔﯩﺮﺍﻣﻤﺎﺗﯩﻜﯩﻨﻰ ﻗﻮﻟﻼﻧﺴﯩﯖﯩﺰﻣﯘ‬ ‫ﺑﻮﻟﯩﺪﯗ. ﻟﯧﻜﯩﻦ ﺗﻪﺷﻪﺑﺒﯘﺳﯘﻡ ﺷﯘﻛﻰ ﺯﯙﺭﯛﺭﯨﻴﻪﺕ ﺗﯘﻏﯘﻟﻤﯩﺴﯩﻼ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﯩﻨﻰ ﺋﯩﺸﻠﯩﺘﯩﯔ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫83‬ ‫ﺗﻮﻟﯘﻕ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ‬ ‫ﺋﺎﻟــﺪﯨﻨﻘﻰ ﻣﻪﺯﻣــﯘﻧﻼﺭﺩﺍ ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨــﺴﯩﻨﯩﯔ ﺋــﻮﺑﻴﯧﻜﺘﻼﺭ ﺗــﻮﭘﻠﯩﻤﻰ ﺋﯜﺳــﺘﯩﺪﯨﻜﻰ ﺋــﺎﺩﺩﯨﻲ‬ ‫ﻣﻪﺷــﻐﯘﻻﺗﻠﯩﺮﯨﻨﻰ ﻛــﯚﺭﯛﭖ ﺋﯚﺗﺘــﯘﻕ. ﺗﻮﻟــﯘﻕ ﺑﻮﻟﻐــﺎﻥ ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨــﺴﻰ ﺗﯧﺨﯩﻤــﯘ ﻣــﯘﻛﻪﻣﻤﻪﻝ‬ ‫ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩﻠﯩﻖ ﻗﯘﺭﯗﻟﻤﯩﻐﺎ ﺋﯩـﮕﻪ. ﮬﻪﺭﺑﯩـﺮ ﺋﯩﭙـﺎﺩﻩ ‪ from‬ﺩﯨـﻦ ﺑﺎﺷـﻠﯩﻨﯩﭗ ﻳـﺎ ‪ select‬ﻳـﺎ ‪ group‬ﺩﯨـﻦ‬ ‫ﺋﺎﺧﯩﺮﻟﯩﺸﯩﺪﯗ. ‪ Sql‬ﺟﯜﻣﻠﯩﺴﯩﮕﻪ ﺋﻮﺧﺸﺎﺵ ‪ select‬ﺩﯨﻦ ﺑﺎﺷﻠﯩﻨﯩﭗ ‪ from‬ﺩﯨـﻦ ﺋﺎﺧﯩﺮﻻﺷﻤﺎﺳـﻠﯩﻘﯩﺪﯨﻜﻰ‬ ‫ﺳﻪﯞﻩﺏ ﻛﻮﺩ ﻳﺎﺯﻏﺎﻧﺪﺍ ﻣﯩﻜﺮﻭﺳﻮﻓﺘﻨﯩﯔ »ﺋﻪﻗﻠﯩﻲ ﺗﻪﯞﺳﯩﻴﻪ«ﺋﯩﻘﺘﯩـﺪﺍﺭﻯ ﺑﯩـﻠﻪﻥ ﺗﻪﻣﯩﻨﻠﻪﺷـﻜﻪ ﻗﻮﻻﻳﻠﯩـﻖ‬ ‫ﻳـــﺎﺭﯨﺘﯩﺶ ﺋﯜﭼﯜﻧـــﺪﯗﺭ. ‪ select‬ﺧـــﺎﺱ ﺳـــﯚﺯﻯ ﺋﯩﭙـــﺎﺩﻩ ﻧﻪﺗﯩﺠﯩـــﺴﯩﻨﻰ ‪ enumerable‬ﺋﻮﺑﻴﯧﻜﺘﯩﻐـــﺎ‬ ‫ﺋﻮﺭﯗﻧﻼﺷﺘﯘﺭﯨﺪﯗ. ‪ group‬ﺧﺎﺱ ﺳﯚﺯﻯ ﺑﻮﻟﺴﺎ ﺋﯩﭙـﺎﺩﻩ ﻧﻪﺗﯩﺠﯩـﺴﯩﻨﻰ ﮔـﯘﺭﯗﭘﭙﯩﻼﺵ ﺷـﻪﺭﺗﯩﮕﻪ ﺋﺎﺳﺎﺳـﻪﻥ‬ ‫ﮬﻪﺭﺑﯩﺮ ﮔﯘﺭﯗﭘﭙﺎ ‪ enumerable‬ﺑﻮﻟﻐﺎﻥ ﮔﯘﺭﯗﭘﭙﯩﻼﺭ ﺗﻮﭘﻠﯩﻤﯩﻐﺎ ﺑﯚﻟﯩﺪﯗ.‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺴﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﯩﻨﯩﯔ ﺗﻮﻟﯘﻕ ﺑﻮﻟﻐﺎﻥ ﺋﻪﻧﺪﯨﺰﻩ)ﻗﯧﻠﯩﭗ( ﻛﻮﺩﻯ:‬ ‫ ‪query‐expression ::= from‐clause query‐body‬‬ ‫ ‬ ‫ =:: ‪query‐body‬‬ ‫ *‪join‐clause‬‬ ‫ *)‪(from‐clause join‐clause* | let‐clause | where‐clause‬‬ ‫ ?‪orderby‐clause‬‬ ‫ )‪(select‐clause | groupby‐clause‬‬ ‫ ?‪    query‐continuation‬‬ ‫ ‬ ‫ ‪from‐clause ::= from itemName in srcExpr‬‬ ‫ ‬ ‫ ‪select‐clause ::= select selExpr‬‬ ‫ ‬ ‫‪groupby‐clause ::= group selExpr by keyExpr‬‬ ‫ﺗﯘﻧﺠﻰ ‪ from‬ﺧﺎﺱ ﺳﯚﺯﻯ ﻛﻪﻳﻨﯩﮕﻪ ﻧﯚﻝ ﻳﺎﻛﻰ ﻧﻪﭼﭽﻪ ‪ ،let ،from‬ﻳﺎﻛﻰ ‪ where‬ﺧﺎﺱ ﺳـﯚﺯﻟﯩﺮﻯ‬ ‫ﺋﻪﮔﯩـــﺸﯩﭗ ﻛﯧﻠﻪﻟﻪﻳـــﺪﯗ. ‪ let‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩـــﺴﻰ ﺋﯩﭙـــﺎﺩﻩ ﻧﻪﺗﯩﺠﯩـــﺴﯩﮕﻪ ﻧـــﺎﻡ ﺑﯧﺮﻩﻟﻪﻳـــﺪﯗ. ‪from‬‬ ‫ﻣﻪﺷﻐﯘﻻﺗﭽﯩ ـــﺴﯩﻐﺎ ﻛ ـــﯚﭖ ﺩﺍﻧﻪ ‪ join‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩ ـــﺴﻰ ﺋﻪﮔﯩ ـــﺸﻪﻟﻪﻳﺪﯗ. ﺋﻪﯓ ﺋ ـــﺎﺧﯩﺮﯨﻘﻰ ‪select‬‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﯩﯔ ﺋﺎﺧﯩﺮﯨﻐـﺎ ‪ orderby‬ﺧـﺎﺱ ﺳـﯚﺯﯨﻨﻰ ﺋﻪﮔﻪﺷـﺘﯜﺭﯛﺵ ﺋـﺎﺭﻗﯩﻠﯩﻖ ﻧﻪﺗﯩﺠﯩﻨـﻰ ﻣﻪﻟـﯘﻡ‬ ‫ﺧﺎﺳﻠﯩﻘﻘﺎ ﺋﺎﺳﺎﺳﻪﻥ ﺳﻮﺭﺗﻠﯩﻐﯩﻠﻰ ﺑﻮﻟﯩﺪﯗ.‬ ‫ﺑﯘﻧﺪﯨﻦ ﻛﯧﻴﯩﻨﻜﻰ ﺋﯘﻗﯘﻣﻼﺭﻧﻰ ﭼﯜﺷﻪﻧﺪﯛﺭﯛﺷﻜﻪ ﻗﻮﻻﻳﻠﯩﻖ ﺑﻮﻟﯘﺵ ﺋﯜﭼﯜﻥ ﻣﯩﺴﺎﻟﻼﺭﻏﺎ ﺗﻮﻟﯘﻗﺮﺍﻕ ﺑﻮﻟﻐﺎﻥ ﺗﯜﺭ‬ ‫ﻗﯘﺭﯗﻟﻤﯩﺴﻨﻰ ﺗﯜﺯﯛﯞﺍﻻﻳﻠﻰ. ﺑﯩﺰ ﺑﯘﻧﺪﯨﻦ ﻛﯧﻴﯩﻦ ﺩﺍﺋﯩﻢ ﺧﯧﺮﯨﺪﺍﺭﻻﺭ ﺗﻮﭘﻠﯩﻤﯩﻐﺎ ﻣﻪﺷﻐﯘﻻﺕ ﺋﯧﻠﯩﭗ ﺑﺎﺭﯨﻤﯩﺰ‬ ‫)‪ . (class Customer‬ﮬﻪﺭﺑﯩﺮ ﺧﯧﺮﯨﺪﺍﺭﻧﯩﯔ ﺑﯘﻳﺮﯗﺗﻘﺎﻥ ﻣﺎﻟﻠﯩﺮﻯ ﺑﺎﺭ. ﺋﯘﻻﺭﻧﻰ ﺋﯩﭙﺎﺩﯨﻠﻪﺵ ﻛﻮﺩﻯ‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ:‬ www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 39 ‫ﻣﯩﺴﺎﻟﻼﺭ ﺋﯜﭼﯜﻥ ﺗﯜﺭ ﻗﯘﺭﯗﻟﻤﯩﺴﻰ‬ public enum Countries {      USA,      Italy,  }    public class Customer {      public string Name;      public string City;      public Countries Country;      public Order[] Orders;  }    public class Order {      public int Quantity;      public bool Shipped;      public string Month;      public int IdProduct;  }    public class Product {      public int IdProduct;      public decimal Price;  }  // ------------------------------------------------------// ‫ﺧﯧﺮﯨﺪﺍﺭﻻﺭ ﺗﻮﭘﻠﯩﻤﯩﻨﻰ ﺩﻩﺳﻠﻪﭘﻠﻪﺷﺘﯜﺭﯛﺵ‬ // ------------------------------------------------------- customers = new Customer[] {    new Customer {Name = "Paolo", City = "Brescia", Country =  Countries.Italy, Orders =    new Order[] {      new Order {Quantity = 3, IdProduct = 1 , Shipped = false, Month  = "January"},      new Order {Quantity = 5, IdProduct = 2 , Shipped = true, Month  = "May"}}},    new Customer {Name = "Marco", City = "Torino", Country =  Countries.Italy, Orders =  www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 40   new Order[] {      new Order {Quantity = 10, IdProduct = 1 , Shipped = false, Month  = "July"},      new Order {Quantity = 20, IdProduct = 3 , Shipped = true, Month  = "December"}}},    new Customer {Name = "James", City = "Dallas", Country =  Countries.USA, Orders =    new Order[] {      new Order {Quantity = 20, IdProduct = 3 , Shipped = true, Month  = "December"}}},    new Customer {Name = "Frank", City = "Seattle", Country =  Countries.USA, Orders =    new Order[] {      new Order {Quantity = 20, IdProduct = 5 , Shipped = false, Month  = "July"}}}};    products = new Product[] {      new Product {IdProduct = 1, Price = 10 },      new Product {IdProduct = 2, Price = 20 },      new Product {IdProduct = 3, Price = 30 },      new Product {IdProduct = 4, Price = 40 },      new Product {IdProduct = 5, Price = 50 },      new Product {IdProduct = 6, Price = 60 }};  ‫ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ‬ ‫ ﻧـﺎﻡ ﺑﻮﺷـﻠﯘﻗﯩﺪﺍ ﺗﻪﻣﯩـﻨﻠﻪﻧﮕﻪﻥ ﺋﺎﺳﺎﺳـﻠﯩﻖ ﻣﯧـﺰﻭﺗﻼﺭ ﯞﻩ ﻛﯚﭘﻤـﺎﺱ‬System.Linq ‫ﮬـﺎﺯﯨﺮﺩﯨﻦ ﺑﺎﺷـﻼﭖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ ﺩﯨﻦ ﭘﺎﻳﺪﯨﻠﯩﻨﯩﭗ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯧﻠﯩـﭗ ﺑﯧـﺮﯨﺶ‬Linq ‫ﻣﯘﯞﻩﻗﻘﻪﺕ ﺗﯩﭙﻠﯩﺮﯨﻨﻰ ﭼﯜﺷﻪﻧﺪﯛﺭﯛﺵ ﺋﺎﺭﻗﯩﻠﯩﻖ‬ .‫ﺗﻮﻧﯘﺷﺘﯘﺭﯗﻟﯩﺪﯗ‬ ‫ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ‬Where ‫)ﺋﯩﺘﺎﻟﯩﻴﻪ( ﺑﻮﻟﻐﺎﻥ ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﯩﯔ‬Italy ‫)ﻳﯘﻗﯩﺮﯨﻘﻰ ﻣﯩﺴﺎﻝ ﻛﻮﺩﻯ ﺋﺎﺳﺎﺳﯩﺪﺍ( ﺳﯩﺰﮔﻪ ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻜﻰ‬ ‫ ﺧﺎﺱ‬where ‫ﻧﺎﻡ ﯞﻩ ﺷﻪﮬﻪﺭ ﺗﯩﺰﯨﻤﻠﯩﻜﻰ ﻻﺯﯨﻢ. ﺑﯘﻧﯩﯔ ﺋﯜﭼﯜﻥ ﺑﺎﺭﻟﯩﻖ ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﻰ ﭼﺎﺭﻻﺵ ﺟﻪﺭﻳﺎﻧﯩﻐﺎ‬ ‫ﺳﯚﺯﻯ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻚ ﭼﻪﻛﻠﯩﻤﯩﺴﯩﻨﻰ ﺑﻪﺭﺳﯩﯖﯩﺰﻻ ﻛﯘﭘﺎﻳﻪ)ﺑﯘﺭﯗﻥ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ‬ ‫ﺋﯩﭙﺎﺩﯨﺴﯩﺪﯨﻜﻰ ﺧﺎﺱ ﺳﯚﺯﻟﻪﺭﮔﻪ ﻣﯘﻧﺎﺳﯩﭗ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻼﺭﻧﯩﯔ ﺑﺎﺭﻟﯩﻘﯩﻨﻰ ﺋﻪﺳﻜﻪﺭﺗﻜﻪﻥ، ﺑﯘ ﻳﻪﺭﺩﯨﻜﻰ‬ :‫ ﺧﺎﺱ ﺳﯚﺯﯨﮕﻪ ﻣﯘﻧﺎﺳﯩﭗ ﻛﯧﻠﯩﺪﯗ( . ﻳﻪﻧﻰ‬where ‫ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ‬Where ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫14‬ ‫ﻛﻮﺩ 3.4‬ ‫ = ‪var expr‬‬ ‫ ‪    from   c in customers‬‬ ‫ ‪    where  c.Country == Countries.Italy‬‬ ‫ ;} ‪    select new { c.Name, c.City‬‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺴﻰ ‪ Where‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ:‬ ‫ (>‪public static IEnumerable Where source‬‬ ‫ ;)‪    Func predicate‬‬ ‫ (>‪public static IEnumerable Where source‬‬ ‫;)‪    Func predicate‬‬ ‫ﻗﯧﻠﯩﭗ ﻛﻮﺩﯨﺪﯨﻦ ﺷﯘﻧﻰ ﻛﯚﺭﯛﯞﯦﻠﯩﺸﻘﺎ ﺑﻮﻟﯩﺪﯗ، ‪ Where‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﯩﯔ ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ ﺋﯩﻜﻜـﻰ ﺧﯩـﻞ‬ ‫ﺋﻪﻧﺪﯨﺰﯨﺴﻰ ﺑﺎﺭ ﺑﻮﻟﯘﭖ، ﺑﯩﺰ ﻳﯘﻗﯩﺮﯨﺪﺍ ﺋﯩﺸﻠﻪﺗﻜﯩﻨﻰ ﺑﯩﺮﯨﻨﭽﻰ ﺧﯩﻠﻰ. ﻳﻪﻧﻪ ﺑﯩﺮ ﺧﯩﻠﯩـﺪﺍ ﺑﻮﻟـﺴﺎ ﭘﯜﺗـﯜﻥ‬ ‫ﺳ ـﺎﻥ ﺗﯩﭙﻠﯩ ـﻖ ﭘ ـﺎﺭﺍﻣﯧﺘﯩﺮ ﺑﯧﻜﯩﺘﻪﻟﻪﻳﻤﯩ ـﺰ. ﺋ ـﯘ ﻧ ـﯚﯞﻩﺗﺘﯩﻜﻰ ﺋﻮﺑﻴﯧﻜﺘﻨﯩ ـﯔ ﺭﻩﺕ ﺗﻪﺭﺗﯩ ـﯟﯨﻨﻰ ﺑﯩﻠﺪﯛﺭﯨ ـﺪﯗ.‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻣﻪﺳﻠﻪﻥ:‬ ‫ﻛﻮﺩ 4.4‬ ‫ = ‪var expr‬‬ ‫ ‪    customers‬‬ ‫ ))1 => ‪    .Where((c, index) => (c.Country == Countries.Italy && index‬‬ ‫ ;)‪    .Select(c => c.Name‬‬ ‫ﺑـﯘ ﺋﯩﭙـﺎﺩﻩ ﺗﻪﺭﺗﯩـﭗ ﻧﻮﻣـﯘﺭﻯ 0 ﺑﻮﻟﻐـﺎﻥ ﺧﯧﺮﯨـﺪﺍﺭ )ﻳﻪﻧـﻰ ‪ Paolo‬ﺋﯩـﺴﯩﻤﻠﯩﻚ ﺧﯧﺮﯨـﺪﺍﺭ( 1=>‪index‬‬ ‫ﺷﻪﺭﺗﯩﻨﻰ ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﺪﯛﺭﻣﯩﮕﻪﭼﻜﻪ ﻧﻪﺗﯩﺠﻪ ﺗﻮﭘﻠﯩﻤﯩﻐﺎ ﻛﯩﺮﻩﻟﻤﻪﻳﺪﯗ.‬ ‫ﺋﻪﭘﺴﯘﺳﻠﯩﻨﺎﺭﻟﯩﻖ ﻳﯧﺮﻯ ﺷﯘﻛﻰ، ﺋﯩﻜﻜﯩﻨﭽﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﻨﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨـﺴﯩﺪﻩ ﺋﯩﭙـﺎﺩﯨﻠﯩﮕﯩﻠﻰ‬ ‫ﺑﻮﻟﻤﺎﻳﺪﯗ ) …‪ from….where….select‬ﺋﺎﺭﻗﯩﻠﯩﻖ ﺩﯦﻤﻪﻛﭽﻰ(.‬ ‫ﺷﯘﻧﯩﺴﻰ ﺋﯧﺴﯩﯖﯩﺰﺩﻩ ﺗﯘﺭﺳﯘﻧﻜﻰ، ﻧﻮﺭﻣﺎﻝ ﮬﺎﻟﻪﺗﺘﻪ ﺗﯘﺭﻏـﯘﻥ ﻗﻪﯞﻩﺕ )‪ ،persistence layer‬ﻣﻪﺳـﯩﻠﻪﻥ:‬ ‫ﺳﺎﻧﺪﺍﻥ( ﺩﯨﻦ ﻛﯚﭖ ﻣﯩﻘﺪﺍﺭﺩﯨﻜﻰ ﺋﯘﭼﯘﺭﻧﻰ ﺋﯩﭽﻜﻰ ﺳﺎﻗﻠﯩﻐﯘﭼﻘﺎ ﺋﻮﻗﯘﭖ ﻛﯩﺮﯨـﺸﻨﻰ ﻳﺎﺧـﺸﻰ ﻣﻪﺷـﻐﯘﻻﺕ‬ ‫ﺩﯦﮕﯩﻠﻰ ﺑﻮﻟﻤﺎﻳﺪﯗ. ﺋﺎﺩﻩﺗﺘﻪ، ﺋﯘﭼﯘﺭﻻﺭﻧﻰ ﺗﯘﺭﻏﯘﻥ ﻗﻪﯞﻩﺕ ﺩﻩﺭﯨﺠﯩﺴﯩﺪﯨﻼ ﺑﻪﺗﻠﻪﺭﮔﻪ ﺑـﯚﻟﮕﻪﻥ)ﺷـﻪﺭﺗﻠﻪﺭ‬ ‫ﺋﺎﺭﻗﯩﻠﯩﻖ( ﻳﺎﺧﺸﻰ. ﮔﻪﺭﭼﻪ ﺑﯘ ﺧﯩﻞ ﺋﯘﺳﯘﻝ ﺑﺎﺭﻟﯩﻖ ﺋﯘﭼﯘﺭﻧﻰ ﺋﯩﭽﻜـﻰ ﺳـﺎﻗﻠﯩﻐﯘﭼﺘﺎ ﺗـﯘﺭﯗﭖ ﺑﻪﺗـﻠﻪﺭﮔﻪ‬ ‫ﺑﯚﻟﮕﻪﻧﮕﻪ ﻗﺎﺭﯨﻐﺎﻥ ﺋﺎﺳﺘﯩﺮﺍﻕ)ﻧﯩﺴﭙﯩﻲ( ﺑﻮﻟﺴﯩﻤﯘ، ﻳﻪﻧﯩﻼ ﭼﻮﻗﯘﻡ ﻛﯩﺮﯨﺶ ﺟﻪﺭﻳﺎﻧﯩﻐﺎ ﻛﻪﺗﻜﻪﻥ ﯞﺍﻗﯩﺘﺘﯩﻦ‬ ‫ﺋﯘﺗﺎﻻﻳﻤﯩﺰ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫24‬ ‫ﺋﻪﻣﻪﻟﯩﻠﻪﺷﺘﯜﺭﯛﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )‪(Projection Operators‬‬ ‫‪ Select‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ‬ ‫ﺋﻪﻣﻪﻟﯩﻠﻪﺷ ـﺘﯜﺭﯛﺵ ﻣﻪﺷ ـﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﻣﻪﻧ ـﺒﻪﺩﯨﻦ ﺋﯘﭼ ـﯘﺭﻻﺭﻧﻰ ﺷ ـﻪﺭﺗﻜﻪ ﺋﺎﺳﺎﺳ ـﻪﻥ ﻳﯩﻐﯩ ـﭗ ﻧﻪﺗﯩﺠﯩ ـﮕﻪ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﻮﺭﯗﻧﻼﺷﺘﯘﺭﯗﺵ ﺭﻭﻟﯩﻨﻰ ﺋﻮﻳﻨﺎﻳﺪﯗ. ﻳﯘﻗﯩﺮﯨﺪﺍ ﻛﯚﭖ ﺋﯘﭼﺮﺍﺗﻘﺎﻥ ‪ Select‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﺋﯘﻧﯩﯔ ﺗﯩﭙﯩﻚ‬ ‫ﻣﯩــﺴﺎﻟﻰ. ﺑﯘﻧــﺪﺍﻕ ﺩﯦﻴﯩــﺸﯩﻤﯩﺰﺩﯨﻜﻰ ﺳــﻪﯞﻩﺏ ﺋــﯘ ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻙ ﻧﻪﺗﯩﺠﯩــﺴﯩﻨﻰ >‪IEnumerable‪public static IEnumerable Select source‬‬ ‫ ;)‪    Func selector‬‬ ‫ (>‪public static IEnumerable Select source‬‬ ‫;)‪    Func selector‬‬ ‫ﺧﯘﺩﺩﻯ ‪ Where‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻐﺎ ﺋﻮﺧﺸﺎ ‪ Select‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻤﯘ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﻨﻰ)ﺗﻮﭘﻼﻡ ﺋﻮﺑﻴﯧﻜـﺖ(‬ ‫ﭼﺎﺭﻻﻳﺪﯗ ﯞﻩ ﺷﻪﺭﺗﻜﻪ ﺋﯘﻳﻐﯘﻧﻠﯩﺮﯨﻨﻰ ﻧﻪﺗﯩﺠﻪ ﺗﯩﺰﻣﯩﺴﯩﻐﺎ)ﻧﻪﺗﯩﺠﻪ ﺗﻮﭘﻼﻡ ﺋﻮﺑﻴﯧﻜﺘﻰ( ﺋﻮﺭﯗﻧﻼﺷﺘﯘﺭﯨﺪﯗ.‬ ‫ﻣﻪﺳﯩﻠﻪﻥ ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﺟﯜﻣﻠﯩﮕﻪ ﻗﺎﺭﺍﯓ:‬ ‫;)‪var expr = customers.Select(c => c.Name‬‬ ‫ﻣﻪﺯﻛﯘﺭ ﺟﯜﻣﻠﯩﻨﯩﯔ ﻧﻪﺗﯩﺠﯩﺴﻰ ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﯩﯔ ﺋﯩﺴﻤﯩﻨﯩﯔ ﺗﯩﺰﻣﯩﺴﻰ ﺑﻮﻟﯩﺪﯗ )>‪.(IEnumerable new { c.Name, c.City‬‬ ‫ﺑﯘ ﺟﯜﻣﻠﯩﺪﯨﻦ ﻗﺎﻳﺘﯩـﺪﯨﻐﯩﻨﻰ ‪ Name‬ﯞﻩ ‪ City‬ﺩﯨـﻦ ﺋﯩﺒـﺎﺭﻩﺕ ﺋﯩﻜﻜـﻰ ﺩﺍﻧﻪ ﺧﺎﺳـﻠﯩﻘﻰ ﺑﻮﻟﻐـﺎﻥ ﻧﺎﻣـﺴﯩﺰ‬ ‫ﺗﯩﭙﻠﯩﻖ ﺋﻮﺑﻴﯧﻜﺘﻼﺭ ﺗﯩﺰﻣﯩﺴﻰ ﺑﻮﻟﯘﭖ، ﺋﯘ ﺧﺎﺳﻠﯩﻘﻠﯩﺮﯨﻨﯩﯔ ﻗﯩﻤﻤﯩﺘـﻰ ﻣﻪﻧـﺒﻪ ﺧﯧﺮﯨـﺪﺍﺭﻻﺭ ﺗﯩﺰﻣﯩـﺴﯩﺪﯨﻜﻰ‬ ‫)‪ (customers‬ﻳﻪﻛﻜﻪ ﺧﯧﺮﯨﺪﺍﺭ ﺋﻮﺑﻴﯧﻜﺘﯩﺪﯨﻦ ﻛﯧﻠﯩﺪﯗ.‬ ‫‪ Select‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩـــﺴﯩﻨﯩﯔ ﺋﯩﻜﻜﯩﭽـــﻰ ﺧﯩـــﻞ ﺋﻪﻧﺪﯨﺰﯨـــﺴﯩﺪﻩ ﭘﯜﺗـــﯜﻥ ﺳـــﺎﻥ ﺗﯩﭙﻠﯩـــﻖ ﭘـــﺎﺭﺍﻣﯧﺘﺮﻯ‬ ‫ﺋﯩ ـﺸﻠﯩﺘﻪﻟﻪﻳﻤﯩﺰ. ﺑ ـﯘ ﭘ ـﺎﺭﺍﻣﯧﺘﯩﺮ ﻣﻪﻧ ـﺒﻪ ﺋﻮﺑﻴﯧﻜ ـﺖ ﺗﯩﺰﻣﯩ ـﺴﯩﺪﯨﻜﻰ ﺋﻮﺑﻴﯧﻜﺘﻼﺭﻧﯩ ـﯔ ﻧﯚﻟ ـﺪﯨﻦ ﺑﺎﺷ ـﻼﻧﻐﺎﻥ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ﺗﻪﺭﺗﯩﭗ ﻧﻮﻣﯘﺭﯨﻨﻰ ﻛﯚﺭﺳﯩﺘﯩﺪﯗ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫34‬ ‫‪ SelectMany‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ‬ ‫ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻜﻰ ‪ Italy‬ﺑﻮﻟﻐﺎﻥ ﺑﺎﺭﻟﯩﻖ ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﯩﯔ ﺑﺎﺭﻟﯩﻖ ﺯﺍﻛﺎﺯﻟﯩﺮﯨﻐﺎ ﺋﯧﺮﯨـﺸﻤﻪﻛﭽﻰ ﺑﻮﻟـﺴﯩﯖﯩﺰ.‬ ‫ﺑﯘﻧﯩﯔ ﺋﯜﭼﯜﻥ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻛﻮﺩ ﻳﯧﺰﻯ ﻳﯧﺰﯨﺸﯩﯖﯩﺰ ﻣﯘﻣﻜﯩﻦ:‬ ‫ﻛﻮﺩ 6.4‬ ‫ = ‪var orders‬‬ ‫ ‪    customers‬‬ ‫ )‪    .Where(c => c.Country == Countries.Italy‬‬ ‫ ;)‪    .Select(c => c.Orders‬‬ ‫ ‬ ‫ } ;)‪foreach(var item in orders) { Console.WriteLine(item‬‬ ‫‪ Select‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩ ــﺴﯩﻨﯩﯔ ﻧﻮﺭﻣـــﺎﻝ ﺧﯘﻟﻘﯩﻐـــﺎ ﺋﺎﺳﺎﺳ ــﻪﻥ ﻣﻪﺯﻛـــﯘﺭ ﺳﯜﺭﯛﺷـــﺘﯜﺭﯛﻛﻨﯩﯔ ﻧﻪﺗﯩﺠﯩـــﺴﻰ‬ ‫ـ‬ ‫ـ‬ ‫>][‪ IEnumerable‪ IEnumerable‪ IEnumerable‪public static IEnumerable SelectMany source‬‬ ‫ ;)‪    Func> selector‬‬ ‫ (>‪public static IEnumerable SelectMany source‬‬ ‫ ;)‪    Func> selector‬‬ ‫ (>‪public static IEnumerable SelectMany source‬‬ ‫ ,‪    Func> collectionSelector‬‬ ‫ ;)‪    Func resultSelector‬‬ ‫ﻣﻪﺯﻛﯘﺭ ﻣﻪﺷﻐﯘﻻﺗﭽﻰ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺴﯩﻨﻰ ﭼﺎﺭﻻﭖ ﻧﻪﺗﯩﺠﻪ ﺋﻪﺯﺍﻟﯩﺮﯨﻨﻰ)‪ (items‬ﺑﯩﺮﻟﻪﺷﺘﯜﺭﯨﺪﯗ ﯞﻩ ﺋـﯘﻻﺭﻧﻰ‬ ‫ﭼﺎﺭﻻﺷﻘﺎ ﺑﻮﻟﯩـﺪﯨﻐﺎﻥ)>‪IEnumerable orders‬‬ ‫ ‪    customers‬‬ ‫ )‪    .Where(c => c.Country == Countries.Italy‬‬ ‫ ;)‪    .SelectMany(c => c.Orders‬‬ ‫ﻛﻮﺩ 7.4 ﺩﯨﻜﻰ ﺋﯩﭙﺎﺩﻩ ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ﺑﯩﻠﻪﻥ ﺑﺎﺭﺍﯞﻩﺭ:‬ ‫ﻛﻮﺩ 8.4‬ ‫ = ‪IEnumerable orders‬‬ ‫ ‪    from   c in customers‬‬ ‫ ‪    where  c.Country == Countries.Italy‬‬ ‫ ‪        from   o in c.Orders‬‬ ‫ ;‪        select o‬‬ ‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﯩﺪﯨﻜﻰ ‪ select‬ﺧـﺎﺱ ﺳـﯚﺯﻯ ﺗـﯘﻧﺠﻰ ‪ from‬ﺧـﺎﺱ ﺳـﯚﺯﯨﺪﯨﻦ ﺑﺎﺷـﻘﺎ‬ ‫‪ from‬ﻻﺭ ﺑﯩـﻠﻪﻥ ﺑﯩﺮﻟﯩـﺸﯩﭗ ‪ SelectMany‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩـﺴﯩﻐﺎ ﺗﻪﺭﺟﯩـﻤﻪ ﻗﯩﻠﯩﻨﯩـﺪﯗ. ﺑﺎﺷـﻘﯩﭽﻪ ﻗﯩﻠﯩـﭗ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﯧﻴﺘﻘﺎﻧﺪﺍ، ﺋﻪﮔﻪﺭ ﺋﯩﭙﺎﺩﯨﺪﻩ ﺑﯩﺮﺩﯨﻦ ﺋـﺎﺭﺗﯘﻕ ‪ from‬ﺧـﺎﺱ ﺳـﯚﺯﻯ ﺑﻮﻟـﺴﺎ ﻛـﺎﻟﻠﯩﯖﯩﺰﺩﺍ ﺗﯚﯞﻩﻧﺪﯨﻜﯩـﺪﻩﻙ‬ ‫ﻗﺎﺋﯩــﺪﯨﮕﻪ ﺳــﯧﻠﯩﯟﯦﻠﯩﯔ: ‪ select‬ﺑﯩــﻠﻪﻥ ﺗــﯘﻧﺠﻰ ‪ from‬ﻧﯩــﯔ ﺑﯩﺮﻟﯩﺸﯩــﺸﻰ ‪ Select‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩــﺴﯩﻐﺎ‬ ‫ﺗﻪﺭﺟﯩﻤﻪ ﻗﯩﻠﯩﻨﯩﺪﯗ، ﺑﺎﺷﻘﺎ ﺑﯩﺮﻟﯩﺸﯩﺸﻠﻪﺭ ﺑﯩﺮﺩﻩﻙ ‪ SelectMany‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻐﺎ ﺗﻪﺭﺟﯩﻤﻪ ﻗﯩﻠﯩﻨﯩﺪﯗ.‬ ‫ﺋﯜﭼﯩﻨﭽﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﻨﻰ ﺗﻪﭘﺴﯩﻠﯩﻲ ﺳﯚﺯﻟﯩﻤﻪﻳﻤﻪﻥ. ﺋﯘﻧﯩﯔ ﺋﯜﭼﯜﻥ ﺑﯩﺮ ﻣﯩﺴﺎﻝ ﻗﺎﻟﺪﯗﺭﺍﻱ:‬ ‫ﻛﻮﺩ 01.4‬ ‫ = ‪IEnumerable orders‬‬ ‫ ‪    from   c in customers‬‬ ‫ ‪    where  c.Country == Countries.Italy‬‬ ‫ ‪        from   o in c.Orders‬‬ ‫ ;}‪        select new {o.Quantity, o.IdProduct‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫54‬ ‫‪ Ordering‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﺳﻮﺭﺗﻼﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ(‬ ‫‪ Ordering‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﯨﻨﯩﯔ ﻗﻮﻟﻠﯩﻨﯩﺸﭽﺎﻧﻠﯩﻘﯩﻤﯘ ﺑﯩﺮﻗﻪﺩﻩﺭ ﻳﯘﻗﯩﺮﻯ ﺑﻮﻟﯘﭖ، ﻧﻪﺗﯩﺠﻪ ﺗﯩﺰﻣﯩـﺴﯩﺪﯨﻜﻰ‬ ‫ﺋﻪﺯﺍﻻﺭﻧﯩﯔ ﺗﻪﺭﺗﯩﭙﯩﻨﻰ ﯞﻩ ﻳﯚﻟﯩﻨﯩﺸﯩﻨﻰ ﺑﻪﻟﮕﯩﻠﻪﺵ ﺋﯩﻘﺘﯩﺪﺍﺭﯨﻐﺎ ﺋﯩﮕﻪ.‬ ‫‪ OrderBy‬ﺑﯩﻠﻪﻥ ‪ OrderByDescending‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ‬ ‫ﺋﻪﮔﻪﺭ ‪ Sql‬ﺋﺎﺭﻗﯩﻠﯩﻖ ﺳﺎﻧﺪﺍﻥ ﻣﻪﺷﻐﯘﻻﺗﻰ ﺋﯧﻠﯩﭗ ﺑﯧﺮﯨﭗ ﺑﺎﻗﻘﺎﻥ ﺑﻮﻟﺴﯩﯖﯩﺰ ﻧﻪﺗﯩﺠﯩﻠﻪﺭﻧﻰ ﻣﻪﻟﯘﻡ ﺷﻪﺭﺗﻜﻪ‬ ‫ﺋﺎﺳﺎﺳﻪﻥ ﺳﻮﺭﺗﻼﺵ)ﺗﯩﺰﯨﺶ( ﻧﯩﯔ ﻣﯘﮬﯩﻢ ﻧﯘﻗﺘﺎ ﺋﯩﻜﻪﻧﻠﯩﻜﯩﻨﻰ ﺋﻪﺳﻜﻪﺭﺗﯩﺸﯩﯖﯩﺰﻧﯩﯔ ﮬﺎﺟﯩﺘﻰ ﻳﻮﻕ. ‪Linq‬‬ ‫ﺑﻮﻟﺴﺎ ‪ ordering‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﻧﻪﺗﯩﺠﯩﺴﯩﮕﻪ ﺋﺎﺷﻤﺎ ﻳﺎﻛﻰ ﻛﯧﻤﻪﻳﺘﻤﯩﻠﯩﻚ‬ ‫ﺳﻮﺭﺗﻼﺵ ﺋﯧﻠﯩﭗ ﺑﺎﺭﺍﻻﻳﺪﯗ. ﻣﻪﺳﯩﻠﻪﻥ: ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻜﻰ ‪ Italy‬ﺑﻮﻟﻐﺎﻥ ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﯩﯔ ﻧﺎﻣﻰ ﺑﯩﻠﻪﻥ‬ ‫ﺷﻪﮬﻪﺭ ﺧﺎﺳﻠﯩﻘﻠﯩﺮﯨﻐﺎ ﻧﺎﻣﯩﻨﯩﯔ ﺋﺎﻟﻔﺎﺑﯩﺖ ﺟﻪﺩﯞﯨﻠﯩﺪﯨﻜﻰ)ﺋﯧﻨﮕﯩﻠﯩﺰﻻﺭﻧﯩﯔ ﺋﯧﻠﯩﭙﺒﻪ ﺗﻪﺭﺗﯩﭙﻰ( ﻛﯧﻤﯩﻴﯩﭗ‬ ‫ﺑﯧﺮﯨﺶ ﺗﻪﺭﺗﯩﭙﻰ ﺑﻮﻳﯩﭽﻪ ﺗﯩﺰﯨﻠﻐﺎﻥ ﮬﺎﻟﯩﺘﯩﺪﻩ ﺋﯧﺮﯨﺸﯩﺶ ﺋﯜﭼﯜﻥ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻛﻮﺩ ﻳﯧﺰﯨﺶ ﻣﯘﻣﻜﯩﻦ:‬ ‫ﻛﻮﺩ 11.4‬ ‫ = ‪var expr‬‬ ‫ ‪    from    c in customers‬‬ ‫ ‪    where   c.Country == Countries.Italy‬‬ ‫ ‪    orderby c.Name descending‬‬ ‫ ;} ‪    select  new { c.Name, c.City‬‬ ‫ﻳ ـﯘﻗﯩﺮﯨﻘﻰ ﺳﯜﺭﯛﺷ ـﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨ ـﺴﻰ ﺗﯚﯞﻩﻧ ـﺪﯨﻜﻰ ﻣﯘﻧﺎﺳ ـﯩﯟﻩﺗﻠﯩﻚ ﺋﻪﻧ ـﺪﯨﺰﯨﻠﻪﺭﺩﯨﻜﻰ ﻣ ـﺎﺱ ﻛﯧﯖﻪﻳ ـﺘﻤﻪ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻣﯧﺘﻮﺩﻻﺭ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻛﻮﺩ 51 ﺩﯨﻜﻰ ﺟﯜﻣﻠﯩﻠﻪﺭﮔﻪ ﺗﻪﺭﺟﯩﻤﻪ ﻗﯩﻠﯩﻨﯩﺪﯗ.‬ ‫ (>‪public static IOrderedSequence OrderBy source‬‬ ‫ ;)‪    Func keySelector‬‬ ‫ (>‪public static IOrderedSequence OrderBy source‬‬ ‫ ,‪    Func keySelector‬‬ ‫ ;)‪    IComparer comparer‬‬ ‫ (>‪public static IOrderedSequence OrderByDescending source‬‬ ‫ ;)‪    Func keySelector‬‬ ‫ (>‪public static IOrderedSequence OrderByDescending source‬‬ ‫ ,‪    Func keySelector‬‬ ‫ ;)‪    IComparer comparer‬‬ www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 46 15 ‫ﻛﻮﺩ‬ var expr =      customers      .Where(c => c.Country == Countries.Italy)      .OrderByDescending(c => c.Name)      .Select(c => new { c.Name, c.City } );  ‫ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ‬ThenByDescending ‫ ﺑﯩﻠﻪﻥ‬ThenBy ‫ﺋﻪﮔﻪﺭ ﻧﻪﺗﯩﺠﯩﻨﻰ ﺑﯩﺮﺩﯨﻦ ﺋـﺎﺭﺗﯘﻕ ﺷـﻪﺭﺕ ﺑﯩـﻠﻪﻥ ﺳـﻮﺭﺗﻠﯩﻤﺎﻗﭽﻰ ﺑﻮﻟـﺴﯩﯖﯩﺰ ﺑـﯘ ﺋﯩﻜﻜـﻰ ﻣﻪﺷـﻐﯘﻻﺗﭽﻰ‬ :‫ﮬﺎﺟﯩﺘﯩﯖﯩﺰﺩﯨﻦ ﭼﯩﻘﯩﺪﯗ. ﺗﯚﯞﻩﻧﺪﯨﻜﯩﻠﻪﺭ ﺋﯘﻻﺭﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ‬ public static IOrderedSequence ThenBy(      this IOrderedSequence source,      Func keySelector);  public static IOrderedSequence ThenBy(      this IOrderedSequence source,      Func keySelector,      IComparer comparer);  public static IOrderedSequence ThenByDescending(      this IOrderedSequence source,      Func keySelector);  public static IOrderedSequence ThenByDescending(      this IOrderedSequence source,      Func keySelector,      IComparer comparer); ‫ ﻣﻪﺷـــــﻐﯘﻻﺗﭽﯩﻠﯩﺮﻧﯩﯖﻜﯩﮕﻪ‬OrderByDescending ‫ ﺑﯩ ــــﻠﻪﻥ‬OrderBy ‫ﺋﯘﻻﺭﻧﯩ ــــﯔ ﺋﻪﻧـــــﺪﯨﺰﯨﻠﯩﺮﻯ‬ ‫ـ‬ ‫ـ‬ ‫ ﻧـﻰ ﭘﻪﻗﻪﺕ‬ThenByDescending ‫ ﺑﯩـﻠﻪﻥ‬ThenBy ،‫ﺋﻮﺧﺸﯩﺸﯩﭗ ﻛﯧﺘﯩـﺪﯗ. ﭘﻪﺭﻗﻠﯩـﻖ ﻳﯧـﺮﻯ ﺷـﯘﻛﻰ‬ ‫ ﻏـﺎ ﺑﻮﻟﻤﺎﻳـﺪﯗ (. ﺷـﯘﯕﺎ ﺑـﯘ‬IEnumerable ) ‫ ﮔﯩﻼ ﻗﻮﻟﻠﯩﻨﯩﺸﻘﺎ ﺑﻮﻟﯩﺪﯗ‬IOrderedSequence ‫ ﻧﯩــﯔ ﻛﻪﻳﻨــﻰ ﺋــﯘﻻﭘﻼ ﺋﯩــﺸﻠﻪﺗﻜﯩﻠﻰ‬OrderByDescending ‫ ﺑﯩــﻠﻪﻥ‬OrderBy ‫ﺋﯩﻜﻜﯩــﺴﯩﻨﻰ ﭘﻪﻗﻪﺕ‬ ‫ ﻻﺭﺩﯨـــﻦ ﻛﻪﻟـــﮕﻪﻥ ﻧﻪﺗﯩـــﺠﻪ‬OrderBy ‫ﺑﻮﻟﯩـــﺪﯗ، ﻣﯘﺳـــﺘﻪﻗﯩﻞ ﺋﯩﺸﻠﯩﺘﯩـــﺸﻜﻪ ﺑﻮﻟﻤﺎﻳـــﺪﯗ. ﭼـــﯜﻧﻜﻰ‬ .‫ ﻧﻰ ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﺎﻥ‬IOrderedSequence :‫ﺗﯚﯞﻩﻧﺪﻩ ﺑﯘﻧﯩﯖﻐﺎ ﺑﯩﺮ ﻣﯩﺴﺎﻝ ﻛﻪﻟﺴﯘﻥ‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫74‬ ‫ﻛﻮﺩ 21.4‬ ‫ ‪var expr = customers‬‬ ‫ )‪    .Where(c => c.Country == Countries.Italy‬‬ ‫ )‪    .OrderByDescending(c => c.Name‬‬ ‫ )‪    .ThenBy(c => c.City‬‬ ‫;) } ‪    .Select(c => new { c.Name, c.City‬‬ ‫ﺋﺎﯞﯞﺍﻝ ﻧﺎﻣﯩﻨﯩـﯔ ﻛﯧﻤﻪﻳﻤﯩـﺴﻰ ﺑـﻮﻳﯩﭽﻪ ﺗﯩﺰﯨـﭗ ﺋﺎﻧـﺪﯨﻦ ﺋﺎﻟـﺪﯨﻨﻘﻰ ﺗﯩـﺰﯨﺶ ﻧﻪﺗﯩﺠﯩـﺴﯩﻨﻰ ﺷـﻪﮬﻪﺭﻧﯩﯔ‬ ‫)‪ (City‬ﺋﺎﺷﻤﯩﺴﻰ ﺑﻮﻳﯩﭽﻪ ﺗﯩﺰﯨﺪﯗ.‬ ‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﺟﯜﻣﻠﯩﻠﻪﺭﻧﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻣﯘﻧﺪﺍﻕ ﺋﯩﭙﺎﺩﯨﻠﻪﺵ ﻣﯘﻣﻜﯩﻦ:‬ ‫ﻛﻮﺩ 21.4‬ ‫ = ‪var expr‬‬ ‫ ‪    from    c in customers‬‬ ‫ ‪    where   c.Country == Countries.Italy‬‬ ‫ ‪    orderby c.Name descending, c.City‬‬ ‫ ;} ‪    select  new { c.Name, c.City‬‬ ‫ﺋﻪﮔﻪﺭ ﺋ ــﯚﺯﯨﯖﯩﺰ ﺳﯧﻠﯩ ــﺸﺘﯘﺭﯗﻟﻤﺎﻗﭽﻰ ﺑﻮﻟﻐ ــﺎﻥ ﺗﯩﭙﯩﯖﯩﺰﻏ ــﺎ ﻧﯩ ــﺴﺒﻪﺗﻪﻥ ﺳﯧﻠﯩ ــﺸﺘﯘﺭﯗﺵ ﻗﺎﺋﯩﺪﯨ ــﺴﯩﻨﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﯧﻜﯩﺘﻤﯩﮕﻪﻥ ﺑﻮﻟـﺴﯩﯖﯩﺰ، ‪ Linq‬ﺳﯩـﺴﺘﯧﻤﯩﻨﯩﯔ ﻛﯚﯕﯜﻟـﺪﯨﻜﻰ ﻗﯩﻤـﻤﻪﺕ ﮬـﺎﻟﯩﺘﻰ ﺑـﻮﻳﯩﭽﻪ ﺳﯧﻠﯩـﺸﺘﯘﺭﯗﺵ‬ ‫ﺋﯧﻠﯩﭗ ﺑﺎﺭﯨﺪﯗ. ﺋﻪﮔﻪﺭ ﺋﺎﻻﮬﯩﺪﻩ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﺵ ﺯﯙﺭﯨﻴﯩﺘﻰ ﺗﯘﻏﯘﻟﺴﺎ، ﻣﻪﺳﯩﻠﻪﻥ ﺧﯧﺮﯨـﺪﺍﺭﻻﺭﻧﯩﯔ ﺋﯩـﺴﻤﻰ‬ ‫ﺋﯘﻳﻐﯘﺭﭼﻪ ﻳﯧﺰﯨﻠﻐﺎﻥ ﺑﻮﻟﺴﺎ ﺋﯘﻻﺭﻧﻰ ﺋﯘﻳﻐﯘﺭ ﺗﯩﻠﻰ ﺋﯧﻠﯩﭙﺒﻪ ﺗﻪﺭﺗﯩﭙﻰ ﺑـﻮﻳﯩﭽﻪ ﺗﯩـﺰﯨﺶ ﻛﯧـﺮﻩﻙ. ﺑﯘﻧـﺪﺍﻕ‬ ‫ﺋﻪﮬﯟﺍﻟﻼﺭﺩﺍ ﺋﻪﻣﻪﻟﯩﻲ ﺋﻪﮬﯟﺍﻟﻐـﺎ ﺧـﺎﺱ ﺑﻮﻟﻐـﺎﻥ ﺳﯧﻠﯩـﺸﺘﯘﺭﻏﯘﭺ ﻳﺎﺳـﺎﭖ، ﺳـﻮﺭﺗﻼﺵ ﻣﻪﺷـﻐﯘﻻﺗﭽﯩﻠﯩﺮﯨﻐﺎ‬ ‫ﭘﺎﺭﺍﻣﯧﺘﯩﺮ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻳـﻮﻟﻼﭖ ﺑﯧﺮﯨـﺸﯩﻤﯩﺰ ﻛﯧـﺮﻩﻙ. ﻣﻪﺳـﯩﻠﻪﻥ: ﺋـﺎﯞﯞﺍﻝ ﺋﯘﻳﻐـﯘﺭﭼﻪ ﺧﻪﺗﻨـﻰ ﺋـﯚﺯ ﺋﯩﭽﯩـﮕﻪ‬ ‫ﺋﺎﻟﻐﺎﻥ ﺋﯩﻜﻜﻰ ﺩﺍﻧﻪ ‪ string‬ﻧﻰ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﺵ ﺗﯜﺭﯨﻨﻰ ﺗﻪﻣﯩﻨﻠﻪﭖ:‬ ‫ﻛﻮﺩ 61‬ ‫ ;‪using System.Globalization‬‬ ‫ { >‪private class UyghurComparer: IComparer orders‬‬ ‫ ‪    customers‬‬ ‫ )‪    .SelectMany(c => c.Orders‬‬ ‫ ;))(‪    .OrderBy(o => o.Month, new MonthComparer‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫84‬ ‫‪ Reverce‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ )ﻛﯚﻣﺘﯜﺭﯛﺵ(‬ ‫ﺑﻪﺯﯨﺪﻩ ﻧﻪﺗﯩﺠﻪ ﺗﯩﺰﻣﯩﺴﯩﻨﯩﯔ ﺗﻪﺭﺗﯩﭙﯩﻨـﻰ ﺋﻪﻛـﺴﯩﮕﻪ ﺋـﯚﺭﯛﺵ ﺋﯧﮫﺘﯩﻴـﺎﺟﻰ ﺗﯘﻏﯘﻟﯩـﺪﯗ. ‪ Linq‬ﺩﺍ ﺑﯘﻧـﺪﺍﻕ‬ ‫ﺋﻪﮬﯟﺍﻟﻐﺎ ﻧﯩﺴﺒﻪﺗﻪﻥ ‪ Reverce‬ﻧﺎﻣﻠﯩﻖ ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪ ﻣﯧﺘﻮﺩ ﺗﻪﻣﯩﻨﻠﻪﻧﮕﻪﻥ. ﻳﻪﻧﻰ:‬ ‫ (>‪public static IEnumerable Reverse source‬‬ ‫ﺗﯚﯞﻩﻧﺪﻩ ‪ Reverce‬ﻧﻰ ﺋﯩﺸﻠﯩﺘﯩﺸﺘﯩﻦ ﺋﺎﺩﺩﻯ ﺑﯩﺮ ﻣﯩﺴﺎﻝ:‬ ‫ﻛﻮﺩ 41.4‬ ‫ = ‪var expr‬‬ ‫ ‪    customers‬‬ ‫ )‪    .Where(c => c.Country == Countries.Italy‬‬ ‫ )‪    .OrderByDescending(c => c.Name‬‬ ‫ )‪    .ThenBy(c => c.City‬‬ ‫ ) } ‪    .Select(c => new { c.Name, c.City‬‬ ‫;)(‪    .Reverse‬‬ ‫ﺑﯩﺮﺍﻕ ‪ Linq‬ﺩﺍ ‪ Reverce‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﺋﯜﭼـﯜﻥ ﻣﻪﺧـﺴﯘﺱ ﺧـﺎﺱ ﻧـﺎﻡ ﺑﯧﻜﯩـﺘﯩﻠﻤﯩﮕﻪﻥ )ﻣﻪﺳـﯩﻠﻪﻥ‬ ‫‪ Select‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﺋﯜﭼﯜﻥ ‪ select‬ﺧـﺎﺱ ﻧـﺎﻣﻰ ﺑﯧﻜﯩـﺘﯩﻠﮕﻪﻥ(، ﺷـﯘﯕﺎ ﺳﯜﺭﯛﺷـﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨـﺴﻰ‬ ‫ﻣﻪﺯﻛﯘﺭ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻨﻰ ﺋﯩﺸﻠﯩﺘﯩﺶ ﺋﯜﭼﯜﻥ ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻣﯩﺴﺎﻟﺪﺍ ﻛﯚﺭﺳـﯩﺘﯩﻠﮕﻪﻧﺪﻩﻙ ﺋﯘﺳـﯘﻝ ﻗـﻮﻟﻠﯩﻨﯩﺶ‬ ‫ﻛﯧﺮﻩﻙ:‬ ‫ﻛﻮﺩ 51.4‬ ‫ = ‪var expr‬‬ ‫ ‪    (from    c in customers‬‬ ‫ ‪    where   c.Country == Countries.Italy‬‬ ‫ ‪    orderby c.Name descending, c.City‬‬ ‫ } ‪    select  new { c.Name, c.City‬‬ ‫;)(‪    ).Reverse‬‬ ‫‪ Grouping‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﮔﯘﺭﯗﭘﭙﯩﻼﺵ(‬ ‫ﺳـــﺎﻥ- ﺳـــﯩﻔﯩﺮ ﺗﯩﺰﻣﯩﻠﯩﺮﯨﻨـــﻰ )ﺋﻪﺯﺍ ﺗﯩﺰﻣﯩﻠﯩـــﺮﻯ( ﻗﺎﻧـــﺪﺍﻕ ﺗـــﺎﻟﻼﺵ، ﺳـــﯜﺯﯛﺵ ﯞﻩ ﺳـــﻮﺭﺗﻼﺵ‬ ‫ﻣﻪﺷـﻐﯘﻻﺗﻠﯩﺮﯨﻨﻰ ﻛـﯚﺭﯛﭖ ﺋﯚﺗﺘـﯘﻕ. ﺑﻪﺯﯨـﺪﻩ ﻳـﯘﻗﯩﺮﯨﻘﻰ ﻣﻪﺷـﻐﯘﻻﺗﻼﺭﺩﯨﻦ ﺋﯧﺮﯨـﺸﻜﻪﻥ ﺋﻪﺯﺍﻻﺭﻧـﻰ ﺑﯩـﺮﻻ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺗﻮﭘﻼﻣﻐﺎ ﺋﻮﺭﯗﻧﻼﺷﺘﯘﺭﻣﺎﻱ، ﻣﻪﻟﯘﻡ ﺷﻪﺭﺗﻜﻪ ﺋﺎﺳﺎﺳﻪﻥ ﺋﻮﺧـﺸﯩﻤﯩﻐﺎﻥ ﮔﯘﺭﯗﭘﭙﯩﻼﺭﻏـﺎ ﺑﯚﻟـﯜﺵ ﺯﻭﺭﯛﺭﯨﻴﯩﺘـﻰ‬ ‫ﺗﯘﻏﯘﻟﯩــﺪﯗ. ‪ Linq‬ﺑﯘﻧــﺪﺍﻕ ﺋﻪﮬﯟﺍﻟﻼﺭﻧﯩﻤــﯘ ﺋﻮﻳﻼﺷــﻘﺎﻥ ﯞﻩ ﻣﯘﻧﺎﺳــﯩﭗ ﻣﻪﺷــﻐﯘﻻﺗﭽﻰ ‪ GroupBy‬ﻧــﻰ‬ ‫ﺗﻪﻣﯩﻨﻠﯩﮕﻪﻥ. ﺋﯘﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ:‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫94‬ ‫ (>‪public static IEnumerable> GroupBy source, Func keySelector‬‬ ‫ (>‪public static IEnumerable> GroupBy source, Func keySelector‬‬ ‫ ;)‪    IEqualityComparer comparer‬‬ ‫ (>‪public static IEnumerable> GroupBy source, Func keySelector‬‬ ‫ ;)‪    Func elementSelector‬‬ ‫ (>‪public static IEnumerable> GroupBy source, Func keySelector‬‬ ‫ ;)‪    Func elementSelector, IEqualityComparer comparer‬‬ ‫ﺑـﺎﺭﻟﯩﻖ ﺋﻪﻧـﺪﯨﺰﯨﻠﯩﺮﻯ >>‪ IEnumerable‪ IGrouping‪ Enumerable c.Country‬‬ ‫ ‬ ‫ { )‪foreach(IGrouping customerGroup in expr‬‬ ‫ ;)‪    Console.WriteLine("Country: {0}", customerGroup.Key‬‬ ‫ { )‪    foreach(var item in customerGroup‬‬ ‫ ;)‪        Console.WriteLine(item‬‬ ‫ }    ‬ ‫ }‬ ‫ﻛﻮﺩ 61.4 ﺩﻩ ﻛﯚﺭﺳﯩﺘﯩﻠﮕﻪﻧﺪﻩﻙ ﮬﻪﺭﺑﯩﺮ ﮔﯘﺭﭘﯩﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭﻧﻰ)ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻜﻰ ﺋﻮﺧﺸﺎﺵ ﺑﻮﻟﻐـﺎﻥ‬ ‫ﺧﯧﺮﯨﺪﺍﺭﻻﺭ( ﭼﺎﺭﻻﺷﺘﯩﻦ ﺋـﺎﯞﺍﻝ ﭼﻮﻗـﯘﻡ ﮔﻮﺭﯗﭘﯩﻼﺭﻧﯩـﯔ ﺋـﺎﭼﻘﯘﭺ ﺳـﯚﺯﯨﻨﻰ ﭼـﺎﺭﻻﺵ ﻛﯧـﺮﻩﻙ. ﮬﻪﺭ ﺑﯩـﺮ‬ ‫ﮔﯘﺭﯗﭘﭙــﺎ >‪ IGrouping customerGroup in expr) {      Console.WriteLine("Country: {0}", customerGroup.Key);      foreach(var item in customerGroup) {          Console.WriteLine(item);      }  }  ‫ ﻧﯩﯔ ﺋﻪﯓ‬GroupBy ‫ﻛﻮﺩ 81.4 ﺩﺍ ﮔﯘﺭﯗﭘﭙﯩﻼﺷﻘﺎ ﺋﺎﻻﻗﯩﺪﺍﺭ ﻳﻪﻧﻪ ﺑﯩﺮ ﺧﯩﻞ ﻣﯩﺴﺎﻝ ﺑﯧﺮﯨﻠﺪﻯ. ﺑﯘ ﻗﯧﺘﯩﻢ‬ .‫ﺋﺎﺧﯩﺮﯨﻘﻰ ﺋﻪﻧﺪﯨﺰﯨﺴﻰ ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺪﯗ‬ 4.18 ‫ﻛﻮﺩ‬ var expr =      customers      .GroupBy(c => c.Country, c => c.Name);    foreach(IGrouping customerGroup in expr) {      Console.WriteLine("Country: {0}", customerGroup.Key);      foreach(var item in customerGroup) {          Console.WriteLine("  {0}", item);      }  }  :‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﭘﺮﻭﮔﺮﺍﻣﻤﯩﻨﯩﯔ ﺋﯩﺠﺮﺍ ﻧﻪﺗﯩﺠﯩﺴﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ‬ Country: Italy Paolo Marco Country: USA James Frank ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫15‬ ‫‪ Join‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﮬﻪﻣﺪﻩﻡ(‬ ‫‪ Join‬ﻣﻪﺷ ــﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ‪ Linq‬ﺳﯜﺭﯛﺷ ــﺘﯜﺭﯛﻙ ﺋﯩﭽﯩ ــﺪﯨﻜﻰ ﺗﯩﺰﻣﯩﻠﯩ ــﺮﻯ ﺋﺎﺭﯨ ــﺴﯩﺪﯨﻜﻰ ﻣﯘﻧﺎﺳ ــﯩﯟﻩﺗﻨﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﻪﻟﮕﯩﻠﻪﺷــﻜﻪ ﺋﯩــﺸﻠﯩﺘﯩﻠﯩﺪﯗ. ‪ SQL‬ﺳــﺎﻧﺪﺍﻥ ﻣﻪﺷــﻐﯘﻻﺗﯩﻨﻰ ﺋﯧﻠﯩــﭗ ﺋﯧﻴﺘــﺴﺎﻕ ﺋﺎﺳﺎﺳــﻪﻥ ﮬﻪﺭﻗﺎﻧــﺪﺍﻕ‬ ‫ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺑﯩـﺮ ﻳـﺎﻛﻰ ﺑﯩﺮﻗـﺎﻧﭽﻪ ﺟﻪﺩﯞﻩﻟﻨـﻰ ﮬﻪﻣﺪﻩﻣﻠﻪﺷـﺘﯜﺭﯨﺪﯗ. ‪ Linq‬ﺩﺍ، ﺑﯩـﺮ ﻗﯩـﺴﯩﻢ ﮬﻪﻣـﺪﻩﻡ‬ ‫ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﻳﯘﻗﯩﺮﯨﻘﯩﺪﻩﻙ ﺧﯘﻟﻘﻨﻰ ﺋﯚﺯﯨﮕﻪ ﻣﯘﺟﻪﺳﺴﻪﻣﻠﻪﺷﺘﯜﺭﮔﻪﻥ.‬ ‫‪) Join‬ﮬﻪﻣﺪﻩﻡ (‬ ‫ﺷﻪﻙ-ﺷﯚﺑﮫﯩﺴﯩﺰﻛﻰ ‪ Join‬ﺑﻮﻟﺴﺎ ﮬﻪﻣﺪﻩﻡ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺋﯩﭽﯩﺪﯨﻜﻰ ﺗـﯘﻧﺠﻰ ﻣﻪﺷـﻐﯘﻻﺗﭽﻰ. ﺋﯘﻧﯩـﯔ‬ ‫ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ:‬ ‫ (>‪public static IEnumerable Join outer‬‬ ‫ ,‪    IEnumerable inner‬‬ ‫ ,‪    Func outerKeySelector‬‬ ‫ ,‪    Func innerKeySelector‬‬ ‫ ;)‪    Func resultSelector‬‬ ‫ (>‪public static IEnumerable Join outer‬‬ ‫ ,‪    IEnumerable inner‬‬ ‫ ,‪    Func outerKeySelector‬‬ ‫ ,‪    Func innerKeySelector‬‬ ‫ ,‪    Func resultSelector‬‬ ‫ ;)‪    IEqualityComparer comparer‬‬ ‫‪ Join‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﭘﺎﺭﺍﻣﯧﺘﯩﺮﺩﺍ ﺗﯚﺕ ﺩﺍﻧﻪ ﻛﯚﭘﻤﺎﺱ ﺗﯩﭙﻨﯩﯔ ﻳﻮﻟﻠﯩﻨﯩﺸﯩﻨﻰ ﺗﻪﻟﻪﭖ ﻗﯩﻠﯩﺪﯗ. ‪ T‬ﺑﻮﻟـﺴﺎ‬ ‫ﺳﯩﺮﺗﻘﻰ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﺎ ﺗﯩﭙﯩﻐﺎ ﯞﻩﻛﯩﻠﻠﯩﻚ ﻗﯩﻠﯩﺪﯗ، ‪ U‬ﺑﻮﻟﺴﺎ ﺋﯩﭽﻜﻰ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣـﺎ ﺗﯩﭙﯩﻨـﻰ ﺋﯩﭙﺎﺩﯨﻠﻪﻳـﺪﯗ.‬ ‫‪ outerKeySelector‬ﺑﯩـﻠﻪﻥ ‪ innerKeySelector‬ﻻﺭ ﺑﻮﻟـﺴﺎ ﺳـﯩﺮﺗﻘﻰ ﯞﻩ ﺋﯩﭽﻜـﻰ ﻣﻪﻧـﺒﻪ‬ ‫ﻛﯚﺭﺳـﻪﺗﻤﻪ‬ ‫ﺗﯩﺰﻣﯩﻠﯩﺮﯨـﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭﻧﯩـﯔ ﺋـﺎﭼﻘﯘﭼﻠﯘﻕ ﺳـﯚﺯﻟﯩﺮﯨﻨﻰ ﻗﺎﻧـﺪﺍﻕ ﭘﻪﺭﻕ ﺋﯧﺘﯩـﺸﻨﻰ ﺋﯧﻴﺘﯩـﭗ ﺑﯧﺮﯨـﺪﯗ. ﺑـﯘ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﺎﭼﻘﯘﭼﻠﯘﻕ ﺳﯚﺯﻟﻪﺭﻧﻰ ﮬﻪﺭ ﺋﯩﻜﻜﯩﻠﯩﺴﻰ ‪ K‬ﺗﯩﭙﻠﯩﻖ ﺑﻮﻟﯘﭖ، ‪ Join‬ﺋﯘﻻﺭﻧﯩﯔ ﺗﻪﯕﻠﯩﻜﯩﻨﻰ ﺋﯚﺯﯨﮕﻪ ﺷﻪﺭﺕ‬ ‫ﻗﯩﻠﯩﺪﯗ. ‪ V‬ﺑﻮﻟﺴﺎ ﺋﺎﯓ ﺋﺎﺧﯩﺮﯨﻘﻰ ﻛﯚﭘﻤﺎﺱ ﺗﯩﭗ ﺑﻮﻟﯘﭖ ﺋﯘ ‪ Join‬ﻧﯩﯔ ﻧﻪﺗﯩﺠﻪ ﺗﯩﺰﻣﯩـﺴﯩﺪﯨﻜﻰ ﮬﻪﺭﺑﯩـﺮ‬ ‫ﺋﻪﺯﺍﻧﯩﯔ ﺗﯩﭙﯩﻨﻰ ﺋﯩﭙﺎﺩﯨﻠﻪﻳﺪﯗ.‬ ‫‪ Join‬ﻧﯩﯔ ﺋﯩﻜﻜﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﺪﻩ ﺳﯧﻠﯩﺸﺘﯘﺭﻏﯘﭼﻘﺎ ﺋﻮﺭﯗﻥ ﺑﯧﺮﯨﻠﮕﻪﻥ ﺑﻮﻟﯘﭖ، ﮬﻪﻣﺪﻩﻣﻠﻪﺷـﻤﻪﻛﭽﻰ‬ ‫ﺑﻮﻟﻐـﺎﻥ ﺋﯩﻜﻜـﻰ ﺗﯩﺰﻣﯩﻨﯩـﯔ ﺋـﺎﭼﻘﯘﭼﻠﯘﻕ ﺳـﯚﺯﻟﯩﺮﯨﻨﻰ ﺳﯧﻠﯩـﺸﺘﯘﺭﺷﻘﺎ ﺋﯩـﺸﻠﯩﺘﯩﻠﯩﺪﯗ. ﺑﯘﻧﯩـﯔ ﺋـﺎﺭﻗﯩﻠﯩﻖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺳﯧﻠﯩــﺸﺘﯘﺭﯗﺵ ﻗﺎﺋﯩﺪﯨــﺴﯩﻨﻰ ﺧﺎﺳﻼﺷﺘﯘﺭﺍﻻﻳــﺴﯩﺰ. ﺋﻪﮔﻪﺭ ﻣﻪﺯﻛــﯘﺭ ﭘﺎﺭﺍﻣﯧﺘﯩﺮﻏــﺎ ‪ Null‬ﺑﯧﺮﯨﻠــﺴﻪ ﻳــﺎﻛﻰ‬ ‫ﺑﯩﺮﻧﭽ ـﻰ ﺧﯩ ـﻞ ﺋﻪﻧﺪﯨﺰﯨ ـﺴﻰ ﺋﯩﺸﻠﯩﺘﯩﻠ ـﺴﻪ ﺳﯧﻠﯩ ـﺸﺘﯘﺭﯗﺵ ﺋﯜﭼ ـﯜﻥ ﻛﯚﯕﯜﻟ ـﺪﯨﻜﻰ ﻗﯩﻤﻤﻪﺗ ـﻜﻪ ﺑﻪﻟﮕﯩ ـﻠﻪﭖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻗﻮﻳﯘﻟﻐﺎﻥ ﺳﯧﻠﺸﺘﯘﺭﻏﯘﭼﻰ ‪ EqualityComparer.Default‬ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺪﯗ.‬ www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 52 ‫ ﻧــﻰ ﻣﯩــﺴﺎﻝ ﺋــﺎﺭﻗﯩﻠﯩﻖ ﭼﯜﺷــﯜﻧﯜﭖ ﺑﺎﻗــﺎﻳﻠﻰ. ﺧﯧﺮﯨــﺪﺍﺭﻻﺭﻧﻰ ﺋﯘﻻﺭﻧﯩــﯔ ﺯﺍﻛــﺎﺯﻟﯩﺮﻯ ﯞﻩ‬Join ‫ﺋﻪﻣــﺪﻯ‬ ‫ﻣﻪﮬﺴﯘﻻﺗﻼﺭ ﺑﯩﻠﻪﻥ ﺑﺎﻏﻼﭖ ﺋﻮﻳﻼﭖ ﻛﯚﺭﯛﯓ. ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺯﺍﻛﺎﺯﻻﺭﻏﺎ ﻣﺎﺱ ﻣﻪﮬﺴﯘﻻﺗﻼﺭﻧﻰ‬ :‫ﮬﻪﻣﺪﻩﻣﻠﻪﺷﺘﯜﺭﯨﺪﯗ‬ 4.19 ‫ﻛﻮﺩ‬ var expr =      customers      .SelectMany(c => c.Orders)      .Join( products,             o => o.IdProduct,             p => p.IdProduct,             (o, p) => new {o.Month, o.Shipped, p.IdProduct,  p.Price });  :‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻧﻪﺗﯩﺠﻪ ﭼﯩﻘﯩﺮﯨﺪﯗ‬ {Month=January, Shipped=False, IdProduct=1, Price=10}  {Month=May, Shipped=True, IdProduct=2, Price=20}  {Month=July, Shipped=False, IdProduct=1, Price=10}  {Month=December, Shipped=True, IdProduct=3, Price=30}  {Month=January, Shipped=True, IdProduct=3, Price=30}  {Month=July, Shipped=False, IdProduct=4, Price=40} lambda.‫ ﺑﻮﻟﺴﺎ ﺋﯩﭽﻜـﻰ ﺗﯩﺰﻣﯩﻐـﺎ ﯞﻩﻛﯩﻠﻠﯩـﻚ ﻗﯩﻠﯩـﺪﯗ‬products ،‫ ﺳﯩﺮﺗﻘﻰ ﺗﯩﺰﻣﯩﻐﺎ‬orders ‫ﺑﯘ ﻣﯩﺴﺎﻟﺪﺍ‬ .‫ ﺗﯩﭙﻠﯩﻖ‬Product ‫ ﯞﻩ‬Order ‫ ﻻﺭ ﺋﺎﻳﺮﯨﻢ-ﺋﺎﻳﺮﯨﻢ ﮬﺎﻟﺪﺍ‬p ‫ ﺑﯩﻠﻪﻥ‬o ‫ﺋﯩﭙﺎﺩﯨﺴﯩﺪﯨﻜﻰ‬ :‫ ﺟﯜﻣﻠﯩﺴﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺋﯩﭙﺎﺩﯨﻠﯩﺴﻪﻙ، ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻳﯧﺰﯨﺶ ﻣﯘﻣﻜﯩﻦ‬Sql ‫ﺋﻪﮔﻪﺭ ﻳﯘﻗﯩﺮﯨﻘﻰ ﺋﯩﭙﺎﺩﯨﻨﻰ‬ SELECT     o.Month, o.Shipped, p.IdProduct, p.Price  FROM       Orders AS o  INNER JOIN Products AS p        ON   o.IdProduct = p.IdProduct  :‫ﺋﻪﮔﻪﺭ ﺋﯩﭙﺎﺩﯨﻨﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻳﺎﺯﺳﺎﻕ ﺗﯚﯞﻩﻧﺪﯨﻜﺪﻩﻙ ﺑﻮﻟﯩﺪﯗ‬ 4.20 ‫ﻛﻮﺩ‬ var expr =      from c in customers          from   o in c.Orders          join   p in products                 on o.IdProduct equals p.IdProduct          select new {o.Month, o.Shipped, p.IdProduct, p.Price };  www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 53 ‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﯩﺪﻩ ﺩﯨﻘﻘﻪﺕ ﻗﯩﻠﯩﺸﻘﺎ ﺗﯩﮕﯩﺸﻠﯩﻚ ﻳﯧﺮﻯ ﺷﯘﻛﻰ‬ (o.IdProduct equals p.IdProduct) ‫ﺑ ـﯘ ﺋﯩﻜﻜﯩ ـﺴﯩﻨﯩﯔ ﺗﻪﺭﺗﯩﭙﻨ ـﻰ ﺋﯚﺯﮔﻪﺭﺗﯩ ـﺸﻜﻪ ﺑﻮﻟﻤﺎﻳ ـﺪﯗ. ﻳﻪﻧ ـﻰ: ﺳ ـﯩﺮﺗﻘﻰ ﺗﯩﺰﻣ ـﺎ ﺑﺎﺷ ـﺘﺎ ﺋﯩﭽﻜ ـﻰ ﺗﯩﺰﻣ ـﺎ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ .‫ﺋﺎﺧﯩﺮﯨﺪﺍ ﻛﯧﻠﯩﺸﻰ ﻛﯧﺮﻩﻙ‬ ‫ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ‬GroupJoin ‫ ﻏـﺎ ﺋﻮﺧﺸﯩـﺸﯩﭗ ﻛﯧﺘﯩـﺪﯨﻐﺎﻥ‬RIGHT OUTER JOIN ‫ ﻳـﺎﻛﻰ‬LEFT OUTER JOIN ‫ ﺩﯨﻜـﻰ‬Sql .‫ ﻣﻪﺷﻐﯘﻻﺗﭽﯩ ـﺴﻰ ﻳﺎﺧـﺸﻰ ﺗ ـﺎﻟﻼﺵ‬GroupJoin .‫ﺋﯩﻘﺘﯩـﺪﺍﺭﻧﻰ ﺋﻪﻣﻪﻟ ـﮕﻪ ﺋﻪﻣﻪﻟـﮕﻪ ﺋﺎﺷ ـﯘﺭﯗﺵ ﺋﯜﭼـﯜﻥ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ :‫ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﯩﯖﻜﯩﮕﻪ ﺋﯩﻨﺘﺎﻳﯩﻦ ﺋﻮﺧﺸﯩﺸﯩﭗ ﻛﯧﺘﯩﺪﯗ‬Join ‫ﺋﯘﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ‬ public static IEnumerable GroupJoin(      this IEnumerable outer,      IEnumerable inner,      Func outerKeySelector,      Func innerKeySelector,      Func, V> resultSelector);  public static IEnumerable GroupJoin(      this IEnumerable outer,      IEnumerable inner,      Func outerKeySelector,      Func innerKeySelector,      Func, V> resultSelector,      IEqualityComparer comparer);  ‫ﺋﻪﻣﻪﻟﯩ ــﻲ ﺋﯩﺸﻠﯩﺘﯩﻠﯩ ــﺸﯩﻨﻰ ﺗﯚﯞﻩﻧ ــﺪﯨﻜﻰ ﻣﯩ ــﺴﺎﻝ ﺋ ــﺎﺭﻗﯩﻠﯩﻖ ﮬ ــﯧﺲ ﻗﯩﻠﯩﯟﯦﻠﯩ ــﯔ، ﮬ ــﺎﺯﯨﺮﭼﻪ ﻛ ــﯚﭖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ .‫ﺗﻮﺧﺘﺎﻟﻤﺎﻳﻤﻪﻥ‬ 4.21 ‫ﻛﻮﺩ‬ var expr =      products      .GroupJoin(          customers.SelectMany(c => c.Orders),          p => p.IdProduct,          o => o.IdProduct,          (p, orders) => new { p.IdProduct, Orders = orders });  foreach(var item in expr) {      Console.WriteLine("Product: {0}", item.IdProduct);      foreach (var order in item.Orders) {          Console.WriteLine("    {0}", order); }}  www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 54 :‫ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺴﻰ ﻳﯘﻗﯩﺮﯨﻘﻰ ﺟﯜﻣﻠﯩﻠﻪﺭﻧﯩﯔ ﺋﯩﺠﺮﺍ ﻧﻪﺗﯩﺠﯩﺴﻰ‬ Product: 1 3 - False - January – 1 10 - False - July – 1 Product: 2 5 - True - May – 2 Product: 3 20 - True - December – 3 10 - True - January – 3 Product: 4 Product: 5 20 - False - July – 5 Product: 6 ‫ ﺧـــﺎﺱ ﺳـــﯚﺯﻟﯩﺮﻯ ﺋـــﺎﺭﻗﯩﻠﯩﻖ‬joint…into… ‫ ﻣﻪﺷﻐﯘﻻﺗﭽﯩـــﺴﻰ‬Join ‫ﺳﯜﺭﯛﺷـــﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨـــﺴﯩﺪﻩ‬ :‫ﺋﯩﭙﺎﺩﯨﻠﯩﻨﯩﺪﯗ. ﻛﻮﺩ 12.4 ﺑﯩﻠﻪﻥ ﺑﺎﺭﻩﯞﻩﺭ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ‬ 4.23 ‫ﻛﻮﺩ‬ var expr =      from   p in products      join   o in (             from c in customers                 from   o in c.Orders                 select o             ) on p.IdProduct equals o.IdProduct             into orders      select new { p.IdProduct, Orders = orders };  ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫55‬ ‫‪ Set‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﺗﻮﭘﻼﻡ(‬ ‫‪ Linq‬ﺳﻪﭘﯩﺮﯨﻤﯩﺰ ﺋﯘﭼﯘﺭ ﺗﯩﺰﻣﯩﻠﯩﺮﯨﻐﺎ ﺋﯧﻠﯩﭗ ﺑﯧﺮﯨﻠﯩﺪﯨﻐﺎﻥ »ﺑﯩﺮﯨﻜﻤﯩﺴﻰ«، »ﻛﻪﺳﻤﯩﺴﻰ« ﯞﻩ »ﺩﯨـﻦ‬ ‫ﺑﺎﺷﻘﺎ« ﻻﺭﺩﻩﻙ ﺋﻪﯓ ﺋﺎﺳﺎﺳﻰ ﻣﻪﺷﻐﯘﻻﺗﻼﺭﻏﺎ ﻛﯧﻠﯩﭗ ﻗﺎﻟﺪﻯ.‬ ‫‪ Distinct‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ )ﺗﻪﻛﺮﺍﺭﻧﻰ ﺗﺎﺯﯨﻼﺵ(‬ ‫ﺑﯩﺮﻗـﺎﻧﭽﻪ ﺧﯧﺮﯨـﺪﺍﺭ ﺋﻮﺧـﺸﺎﺵ ﺑﯩـﺮ ﻣﻪﮬـﺴﯘﻻﺗﻨﻰ ﺯﺍﻛـﺎﺯ ﻗﯩﻠﯩـﺸﻰ ﻣـﯘﻣﻜﯩﻦ. ﺩﯦـﻤﻪﻙ ﺳـﯩﺰ ﺧﯧﺮﯨـﺪﺍﺭﻻﺭ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺯﺍﻛﺎﺯﻟﯩﺮﯨﺪﯨﻜﻰ ﻣﻪﮬﺴﯘﻻﺗﻼﺭﻧﻰ ﺋﻮﻗﯘﭖ ﭼﯩﻘﺴﯩﯖﯩﺰ ﻧﻪﺗﯩﺠﻪ ﺗﯩﺰﻣﯩﺴﯩﺪﺍ ﺗﻪﻛﺮﺍﺭ ﺋﻪﺯﺍ ﻛﯚﺭﯛﻟﯩـﺸﻰ ﻣـﯘﻣﻜﯩﻦ.‬ ‫ﻣﯘﺷﯘ ﺧﯩﻞ ﺗﻪﻛﺮﺍﺭﻟﯩﻘﻨﯩﯔ ﺋﺎﻟﺪﯨﻨﻰ ﺋﯧﻠﯩﺶ ﺋﯜﭼﯜﻥ ﻗﺎﻧﺪﺍﻕ ﻗﯩﻠﯩﺶ ﻛﯧﺮﻩﻙ؟ ﻣﯘﺷـﯘ ﺧﯩـﻞ ﻣﻪﺳـﯩﻠﻪ ‪Sql‬‬ ‫ﺟﯜﻣﻠﯩﺴﯩﺪﻩ ﺋﺎﺩﻩﺗﺘﻪ ‪ Join‬ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﻰ ﺋﯩﭽﯩﺪﻩ ‪ DISTINCT‬ﺧﺎﺱ ﺳـﯚﺯﯨﻨﻰ ﺋﯩـﺸﻠﯩﺘﯩﺶ ﺋـﺎﺭﻗﯩﻠﯩﻖ‬ ‫ﮬﻪﻝ ﻗﯩﻠﯩﻨﺎﺗﺘﻰ. ‪ Linq‬ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﻠﯩﺮﯨﺪﻩ ﺑﻮﻟﺴﺎ ﺑﯘﻧﯩﯔ ﺋﯜﭼﯜﻥ ﺗﻮﭘﻼﻡ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﯨﻨﯩﯔ ﺋﻪﺯﺍﺳﻰ‬ ‫ﻣﻪﺷﻐﯘﻻﺗﭽﯩـﺴﯩﻨﻰ ﺗﻪﻣﯩـﻨﻠﯩﮕﻪﻥ. ﺋﯘﻧﯩ ـﯔ ﺋﻪﻧﺪﯨﺰﯨـﺴﻰ ﺋﯩﻨﺘـﺎﻳﯩﻦ ﺋـﺎﺩﺩﻯ ﺑﻮﻟ ـﯘﭖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﻮﻟﻐـﺎﻥ ‪Distinct‬‬ ‫ﺑﯧﺮﯨﺪﯗ.‬ ‫‪ Distinct‬ﺋﯜﭼﯜﻥ ﺑﯩﺮ ﻣﯩﺴﺎﻝ ﻛﻮﺩ 42.4 ﺩﻩ ﺑﯧﺮﯨﻠﺪﻯ.‬ ‫ﭘﻪﻗﻪﺕ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﻨﯩﻼ ﻗﻮﺑﯘﻝ ﻗﯩﻠﯩﭗ ﺋﯘﻧﯩـﯔ ﺋﻪﺯﺍﻟﯩـﺮﻯ ﺋﺎﺭﯨـﺴﯩﺪﯨﻜﻰ ﺋـﯚﺯﮔﯩﭽﻪ ﺋﻪﺯﺍﻻﺭﻧـﻰ ﻗـﺎﻳﺘﯘﺭﯗﭖ‬ ‫ (>‪public static IEnumerable Distinct source‬‬ ‫ﻛﻮﺩ 42.4‬ ‫ = ‪var expr‬‬ ‫ ‪    customers‬‬ ‫ )‪    .SelectMany(c => c.Orders‬‬ ‫ ,‪    .Join(products‬‬ ‫ ,‪          o => o.IdProduct‬‬ ‫ ,‪          p => p.IdProduct‬‬ ‫ )‪          (o, p) => p‬‬ ‫ ;)(‪    .Distinct‬‬ ‫ﮔﻪﺭﭼﻪ ‪ Distinct‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻐﺎ ﻣﺎﺱ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺧﺎﺱ ﺳﯚﺯﻯ ﺗﻪﻣﯩﻨﻠﻪﻧﻤﯩﮕﻪﻥ ﺑﻮﻟـﺴﯩﻤﯘ، ﺋـﯘﻧﻰ‬ ‫ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﻧﻪﺗﯩﺠﯩﺴﻰ ﺋﯜﺳﺘﯩﮕﻪ ﻗﻮﻟﻠﯩﻨﺎﻻﻳﻤﯩﺰ. ﻣﻪﺳﯩﻠﻪﻥ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ:‬ ‫ﻛﻮﺩ 52.4‬ ‫ = ‪var expr‬‬ ‫ ‪    (from c in customers‬‬ ‫ ‪         from   o in c.Orders‬‬ ‫ ‪         join   p in products‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫65‬ ‫ ‪                on o.IdProduct equals p.IdProduct‬‬ ‫ ‪         select p‬‬ ‫ ;)(‪    ).Distinct‬‬ ‫ﻧﻮﺭﻣﺎﻝ ﮬﺎﻟﻪﺗﺘﻪ ‪ Distinct‬ﺋﯧﻠﯧﻤﯧﻨﺘﻼﺭﻧﻰ ﺋﯘﻻﺭﻧﯩﯔ ‪ GetHashCode‬ﯞﻩ ‪ Equals‬ﻣﯧﺘـﻮﺩﻟﯩﺮﻯ ﺋـﺎﺭﻗﯩﻠﯩﻖ‬ ‫ﺑﯩﺮ-ﺑﯩﺮﻯ ﺑﯩـﻠﻪﻥ ﺳﯧﻠﯩـﺸﺘﯘﺭﯨﺪﯗ ﯞﻩ ﺋﯚﺯﺋـﺎﺭﺍ ﭘﻪﺭﻗﻠﻪﻧﺪﯛﺭﯨـﺪﯗ. ﺋﻪﮔﻪﺭ ﺯﻭﺭﯛﺭ ﺗﯧﭙﯩﻠـﺴﺎ ‪ Distinct‬ﻧﯩـﯔ‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﺋﻪﻧﺪﯨﺰﯨﺴﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺋﯘﻧﯩﯖﻐﺎ ﺋﯚﺯﯨﻤﯩﺰﻧﯩـﯔ ﺳﯧﻠﯩﺸﺘﯘﺭﻏﯘﭼﯩـﺴﯩﻨﻰ ﻳـﻮﻟﻼﭖ ﺳﯧﻠﯩـﺸﺘﯘﺭﯗﺵ‬ ‫ﺧﯘﻟﻘﯩﻨﻰ ﻛﻮﻧﺘﺮﻭﻝ ﻗﯩﻼﻻﻳﻤﯩﺰ.‬ ‫‪Union, Intersect, and Except‬‬ ‫‪ Union‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﺋﯩﻜﻜﻰ ﺗﯩﺰﻣﺎ ﺋﯧﻠﯧﻤﯧﻨﺘﻠﯩﺮﯨﻨﻰ ﺗﻪﻛﺮﺍﺭﻟﯩﻘﻨـﻰ ﻳﻮﻗﺎﺗﻘـﺎﻥ ﺋﺎﺳﺎﺳـﺘﺎ ﺑﯩﺮﻟﻪﺷـﺘﯜﺭﯛﭖ‬ ‫ﭼﯩﻘﯩﺪﯗ. ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫ﻛﻮﺩ 62.4‬ ‫ ;)‪var expr = customers[1].Orders.Union(customers[2].Orders‬‬ ‫ﺧﯘﺩﺩﻯ ‪ Distinct‬ﻗـﺎ ﺋﻮﺧـﺸﺎﺵ ﺑﯘﻻﺭﻣـﯘ ﺋﯧﻠﯧﻤﯧﻨﺘﻠﯩﺮﻧـﻰ ﺳﯧﻠﯩـﺸﺘﯘﺭﯗﺵ ﺋﯜﭼـﯜﻥ ‪ GetHashCode‬ﯞﻩ‬ ‫‪ Equals‬ﻣﯧﺰﻭﺗﻼﺭﻧــــﻰ ﺋﯩــــﺸﻠﺘﯩﺪﯗ)ﺑﯩﺮﯨﻨﭽــــﻰ ﺋﻪﻧﺪﯨﺰﯨــــﺴﯩﺪﻩ(. ﺋﻪﻟــــﯟﻩﺗﺘﻪ، ﺧﺎﺳﻼﺷــــﺘﯘﺭﯗﻟﻐﺎﻥ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺳﯧﻠﯩــﺸﺘﯘﺭﻏﯘﭼﻨﻰ ﺋﯩﺸﻠﯩﺘﯩــﺸﻜﻪ ﻳــﻮﻝ ﻗﻮﻳﻐــﺎﻥ ﺋﻪﻧــﺪﯨﺰﯨﻠﻪﺭﻣﯘ ﺑــﺎﺭ. ﻣﻪﺳــﯩﻠﻪﻥ، ﻛــﻮﺩ 62.4 ﻧﯩــﯔ‬ ‫ﻧﻪﺗﯩﺠﯩﺴﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﺑﻮﻟﯩﺪﯗ.‬ ‫ 1 – ‪10 ‐ False ‐ July‬‬ ‫ 3 – ‪20 ‐ True ‐ December‬‬ ‫3 ‐ ‪20 ‐ True ‐ December‬‬ ‫ﻧﻪﺗﯩﺠﻪ ﺋﻮﻳﻠﯩﻐﺎﻥ ﻳﯧﺮﯨﯖﯩﺰﺩﯨﻦ ﭼﯩﻘﻤﯩﻐﺎﻧﺪﻩﻛﻤﯘ؟ ﺋﺎﺧﯩﺮﯨﻘﻰ ﺋﯩﻜﻜﻰ ﻗﯘﺭ ﺋﻮﭘﻤﯘ- ﺋﻮﺧﺸﺎﺵ ﺗﯘﺭﯨـﺪﯨﻐﯘ،‬ ‫ﺋﻪﺟﯩﺒﺎ ‪ Distinct‬ﻧﯩﯔ ﺭﻭﻟﻰ ﺑﻮﻟﻤﯩﻐﺎﻧﺪﯨﻤﯘ؟‬ ‫»ﻣﯩـــﺴﺎﻟﻼﺭ ﺋﯜﭼـــﯜﻥ ﺗـــﯜﺭ ﻗﯘﺭﯗﻟﻤﯩـــﺴﻰ« ﺩﯨﻜـــﻰ ﺧﯧﺮﯨـــﺪﺍﺭ ﺋـــﻮﺑﻴﯧﻜﺘﻠﯩﺮﯨﻨﻰ ﺩﻩﺳﻠﻪﭘﻠﻪﺷـــﺘﯜﺭﯛﺵ‬ ‫ﻛﻮﺩﯨﻐـﺎ)ﻣﻪﺯﻛـﯘﺭ ﻣﺎﻗﺎﻟﯩـﺪﯨﻜﻰ ﺑـﺎﺭﻟﯩﻖ ﻛـﻮﺩﻻﺭ ﻧﯩـﯔ ﻣﯩـﺴﺎﻝ ﻣﻪﺷـﻐﯘﻻﺕ ﺋـﻮﺑﯩﻜﺘﻰ( ﻧﻪﺯﻩﺭ ﺳـﺎﻟﯩﺪﯨﻐﺎﻥ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﻮﻟﺴﺎﻕ، ﺩﻩﺳﻠﻪﭘﻠﻪﺷﺘﯜﺭﯛﻟﮕﻪﻥ ﮬﻪﺭ ﺑﯩﺮ ﺯﺍﻛﺎﺯ ﺋﻪﺯﺍﺳﻰ)‪ (order‬ﺑﻮﻟﺴﺎ ‪ Order‬ﻧﺎﻣﻠﯩﻖ ﭼﺎﻗﯩﺮﯨﻠﻤﺎ)‪(引用‬‬ ‫ﺗﯩﭙﻨﯩــﯔ ﺋﻮﺧــﺸﯩﻤﯩﻐﺎﻥ ﺋــﻮﺑﻴﯧﻜﺘﻠﯩﺮﻯ. ﮔﻪﺭﭼﻪ ﺋﯩﻜﻜﯩﭽــﻰ ﺧﯧﺮﯨــﺪﺍﺭﻧﯩﯔ ﺋﯩﻜﻜﯩﻨﭽــﻰ ﺯﺍﻛــﺎﺯﻯ ﺑﯩــﻠﻪﻥ‬ ‫ﺋ ـﯜﭼﯩﻨﭽﻰ ﺧﯧﺮﯨــﺪﺍﺭﻧﯩﯔ ﺑﯩﺮﯨﻨﭽــﻰ ﺯﺍﻛ ـﺎﺯﻯ ﺳــﺎﻥ- ﺳــﯩﻔﯩﺮ ﺟﻪﮬﻪﺗ ـﺘﯩﻦ ﺋﻮﺧــﺸﺎﺵ ﺑــﻮﻟﻐﯩﻨﻰ ﺑﯩــﻠﻪﻥ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﯘﻻﺭﻧﯩﯔ ‪ Hash‬ﻛﻮﺩﻯ ﺋﻮﺧﺸﯩﻤﺎﻳﺪﯗ.‬ ‫ﻧﻪﺗﯩﺠﯩـﺪﻩ ﺋـﯘﻻﺭﻧﻰ ﺳﯧﻠﯩـﺸﺘﯘﺭﻏﺎﻧﺪﺍ ﻳﻪﻧﯩـﻼ ﺋﻮﺧـﺸﯩﻤﯩﻐﺎﻥ ﺋﻮﺑﻴﯧﻜـﺖ ﺑﻮﻟـﯘﭖ ﭼﯩﻘﯩـﭗ ‪ Distinct‬ﻧﯩـﯔ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺗﻪﻛﺮﺍﺭﻟﯩﺮﯨﻨﻰ ﺳﯜﺯﯛﺵ ﺋﻪﻟﮕﯩﻜﯩﺪﯨﻦ)ﺋﻪﻟﮕﻪﻙ: ﺋﺎﺋﯩﻠﯩﻠﻪﺭﺩﻩ ﺋﯘﻥ ﺗﺎﺳﻘﺎﺷـﻘﺎ ﺋﯩـﺸﻠﯩﺘﯩﻠﯩﺪﯨﻐﺎﻥ ﺳـﯜﺯﮔﯜﭺ(‬ ‫ﺋﯚﺗﯜﭖ ﻛﯧﺘﯩﺪﯗ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫75‬ ‫ﻗﻮﺷﯘﻣﭽﻪ ﺳﺎﯞﺍﺕ 1‬ ‫ﻣﻪﻟﯘﻡ ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺗﯩﭙﻨﯩﯔ ﺋﯩﻜﻜﻰ ﺋﻮﺑﻴﯧﻜﺘﯩﻨﻰ )ﻣﻪﺳﯩﻠﻪﻥ ﺑﯩﺰﻧﯩﯔ ﻣﯩﺴﺎﻟﯩﻤﯩﺰﺩﯨﻜﻰ‬ ‫‪ (Customer‬ﺳﯩﺴﺘﯧﻤﺎ ﻛﯚﯕﯜﻟﺪﯨﻜﻰ ﻗﯩﻤﻤﻪﺕ ﮬﺎﻟﻪﺗﺘﻪ ﺳﯧﻠﯩﺸﺘﯘﺭﻏﺎﻧﺪﺍ ﮬﻪﺭﺑﯩﺮﯨﻨﯩﯔ ‪Hash‬‬ ‫ﻛﻮﺩﯨﻨﻰ ﺳﯧﻠﯩﺸﺘﯘﺭﯨﺪﯗ. ﮔﻪﺭﭼﻪ ﺋﯘ ﺋﯩﻜﻜﯩﺴﯩﻨﯩﯔ ﺧﺎﺳﻠﯩﻘﻠﯩﺮﯨﻨﯩﯔ ﻗﯩﻤﻤﻪﺗﻠﯩﺮﻯ ﺋﻮﺧﺸﺎﺵ‬ ‫ﺑﻮﻟﯩﺴﯩﻤﯘ ﻟﯧﻜﯩﻦ ‪ Hash‬ﻛﻮﺩﻯ ﺋﻮﺧﺸﺎﺵ ﭼﯩﻘﻤﺎﻳﺪﯗ. ﭼﯜﻧﻜﻰ ﺋﯘﻻﺭ ﺑﻪﺭﯨﺒﯩﺮ ﺋﯩﻜﻜﻰ‬ ‫ﺋﻮﺑﻴﯧﻜﺖ. ﮬﻪﺭﻗﺎﻧﺪﺍﻕ ﺗﯩﭙﻠﯩﻖ ﺋﻮﺑﻴﯧﻜﺘﻼﺭﻧﯩﯔ ‪ Hash‬ﻛﻮﺩﻯ ‪ .Net‬ﻗﯘﺭﯗﻟﻤﯩﺴﯩﺪﯨﻜﻰ‬ ‫ﺑﺎﺭﻟﯩﻖ ﺗﯩﭙﻼﺭﻧﯩﯔ ﺋﻪﺟﺪﺍﺩﻯ ﺑﻮﻟﻐﺎﻥ ‪Object‬ﺗﯩﭙﺘﯩﻦ ﻣﯩﺮﺍﺱ ﻗﺎﻟﻐﺎﻥ )(‪GetHashCode‬‬ ‫ﻣﯧﺘﻮﺩﻯ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺋﯧﻠﯩﻨﯩﺪﯗ. ﺷﯘﯕﺎ ﺑﯘﻧﺪﺍﻕ ﺋﻪﮬﯟﺍﻝ ﺋﺎﺳﺘﯩﺪﺍ ﺗﯩﭙﻼﺭﻧﯩﯔ ﻣﯩﺮﺍﺱ ﺋﺎﻟﻐﺎﻥ‬ ‫)(‪ GetHashCode‬ﯞﻩ ‪ Equals‬ﻣﯧﺘﻮﺩﻟﯩﺮﻧﻰ ﻗﺎﭘﻼﭖ ﻳﯧﺰﯨﺶ )‪ (override, 重写‬ﺋﺎﺭﻗﯩﻠﯩﻖ‬ ‫ﺋﯘﻻﺭﻧﯩﯔ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﻟﯘﺵ ﺧﯘﻟﻘﻠﯩﺮﯨﻨﻰ ﺋﯚﺯﮔﻪﺭﺗﯩﺸﻜﻪ ﺗﻮﻏﺮﺍ ﻛﯧﻠﯩﺪﯗ. ﺋﻪﻣﻤﺎ‬ ‫ﻗﯩﻤﻤﻪﺗﻠﯩﻚ)‪ (value type,值类型‬ﺗﯩﭙﻼﺭﻧﻰ)‪ int, float, struct‬ﺩﯦﮕﻪﻧﺪﻩﻙ(‬ ‫ﺳﯩﻠﯩﺸﺘﯘﺭﯗﺷﺘﺎ ﺋﯩﺶ ﺑﺎﺷﻘﯩﭽﯩﺮﻩﻙ ﺑﻮﻟﯩﺪﯗ. ﺋﻪﮔﻪﺭ ﺋﯩﻜﻜﯩﺴﯩﻨﯩﯔ ﻗﯩﻤﻤﯩﺘﻰ ﺋﻮﺧﺸﺎﺷﻼ ﺑﻮﻟﺴﺎ‬ ‫ﺋﯘﻻﺭ ﺗﻪﯕﺪﺍﺵ ﺩﻩﭖ ﻗﺎﺭﯨﻠﯩﺪﯗ.‬ ‫ﻳﯩﻐﯩﻨﭽﺎﻗﻠﯩﻐﺎﻧﺪﺍ ‪ Linq‬ﺩﯨﻜﻰ ﺑﺎﺭﻟﯩﻖ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﺷﻼﺭ ﻳﯘﻗﯩﺮﯨﻘﻰ ﻗﺎﺋﯩﺪﯨﮕﻪ ﭼﯜﺷﯩﺪﯗ،‬ ‫ﺷﯘﯕﺎ ﻧﻪﺗﯩﺠﻪ ﺋﻮﻳﻠﯩﻐﺎﻥ ﻳﯧﺮﯨﯖﯩﺰﺩﯨﻦ ﭼﯩﻘﻤﺎﻱ ﻗﺎﻟﯩﺪﯨﻐﺎﻥ ﺋﯩﺸﻼﺭﺩﯨﻦ ﺧﺎﻟﻰ ﺑﻮﻻﻟﻤﺎﻳﺴﯩﺰ.‬ ‫ﻣﯘﺷﯘﻧﺪﺍﻕ ﻣﻪﺳﯩﻠﯩﻠﻪﺭﻧﯩﯔ ﺋﺎﻟﺪﯨﻨﻰ ﺋﯧﻠﯩﺶ ﺋﯜﭼﯜﻥ، ﺋﯚﺯﯨﯖﯩﺰﻧﯩﯔ ﺷﻪﺧﺴﻰ ﭼﺎﻗﯩﺮﯨﻠﻤﺎ‬ ‫ﺗﯩﭙﻠﯩﺮﯨﻐﺎ )‪ Order‬ﺩﻩﻙ( ﺋﺎﻣﺎﻝ ﺑﺎﺭ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﺵ ﺧﯘﻟﻘﻠﯩﺮﯨﻨﻰ ﻗﻮﺷﯘﯓ. ﻳﺎﻛﻰ ﻛﯚﭖ ﻗﯩﺴﯩﻢ‬ ‫ﭘﺮﻭﮔﺮﺍﻣﻤﯧﺮﻻ ﺗﻪﺷﻪﺑﺒﯘﺱ ﻗﯩﻠﻐﺎﻧﺪﻩﻙ ‪ class‬ﻧﯩﯔ ﺋﻮﺭﻧﯩﻐﺎ ‪ struct‬ﺩﻩﻙ ﻗﯩﻤﻤﻪﺗﻠﯩﻚ ﺗﯩﭙﻠﯩﻖ‬ ‫ﮬﺎﺳﯩﻼﺕ ﺗﯩﭙﻼﺭﻧﻰ ﺋﯩﺸﻠﯩﺘﯩﯔ.‬ ‫ﺩﯦﻤﻪﻙ ﻗﻮﺷﯘﻣﭽﻪ ﺳﺎﯞﺍﺕ 1 ﺋﯧﻴﺘﯩﭗ ﺋﯚﺗﻜﻪﻥ ﺋﯘﺳﯘﻟﯩﻤﯩﺰ ﺑﻮﻳﯩﭽﻪ ﺯﺍﻛﺎﺯ)‪ (Order‬ﺗﯩﭙﯩﻨﯩﯔ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﺵ‬ ‫ﺧﯘﻟﻘﯩﻨﻰ ﺋﯚﺯﮔﻪﺭﺗﯩﺸﻜﻪ ﺗﻮﻏﺮﺍ ﻛﻪﻟﺪﻯ. ﺋﯘﺳﯘﻟﻰ ﻣﯘﻧﺪﺍﻕ:‬ ‫ { ‪public class Order‬‬ ‫ ;‪    public int Quantity‬‬ ‫ ;‪    public bool Shipped‬‬ ‫ ;‪    public string Month‬‬ ‫ ;‪    public int IdProduct‬‬ ‫)(‪ ToString‬ﻣﯧﺘﻮﺩﯨﻨﻰ ﻗﺎﭘﻼﭖ ﻳﯧﺰﯨﺶ ﺋﺎﺭﻗﯩﻠﯩﻖ، ﻣﻪﺯﻛﯘﺭ ﺗﯩﭙﻨﯩﯔ ﺋﯩﺴﻤﯩﻐﺎ ﯞﻩﻛﯩﻠﻠﯩﻚ ﻗﯩﻠﯩﺪﯨﻐﺎﻥ //‬ ‫ﮬﻪﺭﭖ-ﺑﻪﻟﮕﻪ ﺗﯩﺰﻣﯩﺴﯩﻨﯩﯔ ﻓﻮﺭﻣﺎﺗﯩﻨﻰ ﺋﯚﺯﮔﻪﺭﺗﻜﯩﻠﻰ ﺑﻮﻟﯩﺪﯗ//‬ ‫ { )(‪    public override string ToString‬‬ ‫ ,"}3{ ‐ }2{ ‐ }1{ ‐ }0{"(‪        return String.Format‬‬ ‫ ;)‪        this.Quantity, this.Shipped, this.Month, this.IdProduct‬‬ ‫ }    ‬ ‫ ‬ ‫ { )‪    public override bool Equals(object obj‬‬ ‫ ))‪        if (!(obj is Order‬‬ ‫ ;‪            return false‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫85‬ ‫ { ‪        else‬‬ ‫ ;‪            Order o = (Order)obj‬‬ ‫ && ‪            return(o.IdProduct == this.IdProduct‬‬ ‫ && ‪                   o.Month == this.Month‬‬ ‫ && ‪                   o.Quantity == this.Quantity‬‬ ‫ } ;)‪                   o.Shipped == this.Shipped‬‬ ‫ }    ‬ ‫ { )(‪    public override int GetHashCode‬‬ ‫ ,‪        return String.Format("{0}|{1}|{2}|{3}", this.IdProduct‬‬ ‫ ;)(‪          this.Month, this.Quantity, this.Shipped).GetHashCode‬‬ ‫ }    ‬ ‫ }‬ ‫ﻳﯘﻗﯩﺮﯨﻘﯩﺪﻩﻙ ﻣﻪﺳﯩﻠﯩﻨﻰ ﮬﻪﻝ ﻗﯩﻠﯩﺸﻨﯩﯔ ﻳﻪﻧﻪ ﺑﯩﺮ ﭼﺎﺭﯨﺴﻰ، ‪ Distinct‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﯩﯔ ﺋﯩﻜﻜﯩﻨﭽﻰ‬ ‫ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﻰ ﺑﻮﻳﯩﭽﻪ، ﺋﯚﺯﯨﻤﯩﺰ ﺗﯜﺯﯛﯞﺍﻟﻐﺎﻥ ﺳﯧﻠﯩﺸﺘﯘﺭﻏﯘﭼﻨﻰ ﭘﺎﺭﺍﻣﯧﺘﯩﺮ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻳﻮﻟﻼﭖ ﺑﯧـﺮﯨﺶ.‬ ‫ﺋـﯜﭼﯩﻨﭽﻰ ﺧﯩـﻞ ﺋﯘﺳـﯘﻟﻰ، ﻳﻪﻧـﻰ ﺋﻪﯓ ﺋـﺎﺧﯩﺮﻗﻰ ﺋﯘﺳـﯘﻟﻰ ﺑﻮﻟـﺴﺎ ‪ Order‬ﺗﯩﭙﯩﻨـﻰ ﻗﯩﻤﻤﻪﺗﻠﯩـﻚ ﺗﯩﭙﻘـﺎ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ. ﺩﯦﻤﻪﻛﭽﻰ، ‪ Order‬ﺗﯩﭙﯩﻨﻰ ‪ class‬ﺋﻪﻣﻪﺱ ‪ struct‬ﺗﯩﭙﻠﯩﻖ ﻗﯩﻠﯩﺶ. ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫‪ struct‬ﺑﻮﻟﺴﺎ ﻗﯩﻤﻤﻪﺕ ﺗﯩﭙﻠﯩﻖ ﮬﺎﺳﯩﻠﻪ ﺗﯩﭗ//‬ ‫ { ‪public struct Order‬‬ ‫ ;‪    public int Quantity‬‬ ‫ ;‪    public bool Shipped‬‬ ‫ ;‪    public string Month‬‬ ‫ ;‪    public int IdProduct‬‬ ‫ }‬ ‫ﺷﯘﻧﯩﺴﻰ ﺋﯧﺴﯩﯖﯩﺰﺩﻩ ﺗﯘﺭﺳﯘﻥ، 0.3#‪ C‬ﺩﯨﻜﻰ ﺑﺎﺭﻟﯩﻖ ﻧﺎﻣﺴﯩﺰ ﺗﯩﭙﻼﺭ ﺑﯩﺮﺩﻩﻙ ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺗﯩﭙﻘﺎ ﺗﻪﯞﻩ.‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺴﻰ ‪ Intersect‬ﺑﯩﻠﻪﻥ ‪ Except‬ﻧﻰ ﺋﯩﺸﻠﯩﺘﯩﺸﺘﯩﻦ ﻣﯩﺴﺎﻝ:‬ ‫ﻛﻮﺩ 72.4‬ ‫ ;)‪var expr1 = customers[1].Orders.Intersect(customers[2].Orders‬‬ ‫ ;)‪var expr2 = customers[1].Orders.Except(customers[2].Orders‬‬ ‫‪ Intersect‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩ ــﺴﻰ ﺋﯩﻜﻜ ــﻰ ﺗﯩﺰﻣﯩ ــﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭﻧﯩ ــﯔ ﻛﻪﺳﻤﯩ ــﺴﯩﻨﻰ ﺋﺎﻟﯩ ــﺪﯗ، ﻳﻪﻧ ــﻰ، ﮬﻪﺭ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﯩﻜﻜﯩﻠﯩﺴﯩﺪﻩ ﺑﻮﻟﻐﺎﻧﻠﯩﺮﯨﻨﻰ.‬ ‫‪) Except‬ﺩﯨـــﻦ ﺑﺎﺷـــﻘﺎ( ﻣﻪﺷﻐﯘﻻﺗﭽﯩـــﺴﻰ ﺑﻮﻟـــﺴﺎ، ﺑﯩﺮﯨﻨﭽـــﻰ ﺗﯩﺰﻣﯩـــﺪﯨﻜﻰ ﺋﯩﻜﻜﯩﻨﭽـــﻰ ﺗﯩﺰﻣﯩـــﺪﺍ‬ ‫ﺋﯘﭼﺮﯨﻤﺎﻳﺪﯨﻐﺎﻥ ﺋﻪﺯﺍﻻﺭﻧﻰ ﺋﺎﻟﯩﺪﯗ.‬ ‫ﺑﯘﻻﺭﻏﯩﻤﯘ ﺗﻪﯕﺪﺍﺵ ﺑﻮﻟﻐﺎﻥ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺧﺎﺱ ﺳﯚﺯﻟﯩﺮﯨﻨﯩﯔ ﻳﻮﻗﻠﯩﻘﯩﻨﻰ ﺩﯦﮕﯜﻡ ﻛﻪﻟﻤﻪﻳﯟﺍﺗﯩﺪﯗ. ﺑﯩﺮﺍﻕ‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﺋﺎﺭﻻﺷﺘﯘﺭﯗﭖ ﺋﯩﺸﻠﯩﺘﻪﻟﻪﻳﻤﯩﺰ:‬ www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 59 4.28 ‫ﻛﻮﺩ‬ var expr =      (from c in customers           from   o in c.Orders           where  c.Country == Countries.Italy           select o      ).Intersect(          from c in customers              from   o in c.Orders              where  c.Country == Countries.USA              select o);  (‫ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﺟﻪﻣﻠﻪﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ‬Aggregate ‫ ﺑﯘﻧﯩـﯔ‬Linq .‫ﺑﻪﺯﯨﺪﻩ ﺗﯩﺰﻣﯩـﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭﻏـﺎ ﻧﯩـﺴﺒﻪﺗﻪﻥ ﮬﯧـﺴﺎﺑﻼﺵ ﺋﯧﻠﯩـﭗ ﺑﯧـﺮﯨﺶ ﺗـﻮﻏﺮﺍ ﻛﯧﻠﯩـﺪﯗ‬ ‫ ﻣﻪﺷـﻐﯘﻻﺗﭽﯩﻠﯩﺮﯨﺪﯨﻦ ﺗﻪﺷـﻜﯩﻞ ﺗﺎﭘﻘـﺎﻥ‬Count, LongCount, Sum, Min, Average ‫ﺋﯜﭼـﯜﻥ‬ ‫ﺟﻪﻣـﻠﻪﺵ ﻣﻪﺷـﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺋﺎﺋﯩﻠﯩـﺴﯩﻨﻰ ﺗﻪﻣﯩـﻨﻠﯩﮕﻪﻥ. ﺑﯘﻻﺭﻧﯩـﯔ ﻛـﯚﭖ ﻗﯩـﺴﯩﻤﻠﯩﺮﯨﻨﯩﯔ ﻗﯩﻠﯩـﺪﯨﻐﺎﻥ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ .‫( ﭼﯜﺷﯜﻧﯜﺵ ﺗﻪﺳﻜﻪ ﺗﻮﺧﺘﯩﻤﺎﻳﺪﯗ‬behavior)‫ﺋﯩﺸﻰ ﻣﯘﺭﻩﻛﻜﻪﭖ ﺑﻮﻟﻤﯩﻐﺎﭼﻘﺎ ﺧﯘﻟﻘﻠﯩﺮﯨﻨﻰ‬ ‫ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ‬LongCount ‫ ﯞﻩ‬Count :‫ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﻰ ﺯﺍﻛﺎﺯ ﺗﯩﺰﻣﯩﺴﯩﻐﺎ ﻗﺎﺭﺗﺎ ﺋﯩﺸﻠﯩﺘﯩﺸﺘﯩﻦ ﻣﯩﺴﺎﻝ‬Count ‫ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺴﻰ‬ 4.29 ‫ﻛﻮﺩ‬ var expr =      from   c in customers      select new {c.Name, c.City, c.Country, OrdersCount =  c.Orders.Count() }; foreach (var v in query)  Console.WriteLine("{0}‐{1}‐{2}‐{3}", v.Name, v.City, v.Country,  v.OrderCount);  :‫ﺋﯩﺠﺮﺍ ﻧﻪﺗﯩﺠﯩﺴﻰ‬ Paolo-Brescia-Italy-2 Marco-Torino-Italy-2 James-Dallas-USA-1 Frank-Seattle-USA-1 ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫06‬ ‫ﺑﻮﻟﻐـﺎﻥ ﻧﺎﻣـﺴﯩﺰ ﺗﯩﭙﻠﯩـﻖ ﺋﻮﺑﻴﯧﻜﺘﻼﺭﻧﯩـﯔ ‪ OrdersCount‬ﻧـﺎﻣﻠﯩﻖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺷــﻪﻛﻠﯩﺪﻩ ﻗــﺎﻳﺘﯘﺭﯗﭖ ﺑﯧﺮﯨــﺪﯗ. ‪Count‬‬ ‫‪int‬‬ ‫ﻳـﯘﻗﯩﺮﯨﻘﻰ ﭘﺮﻭﮔﺮﺍﻣﻤﯩـﺪﯨﻦ ﮬﺎﺳـﯩﻞ‬ ‫ـ‬ ‫ـ‬ ‫ﺧﺎﺳﻠﯩﻘﯩﻨﯩﯔ ﻗﯩﻤﻤﯩﺘﻰ ﻣـﺎﺱ ﺧﯧﺮﯨـﺪﺍﺭﻧﯩﯔ ﺯﺍﻛـﺎﺯ ﺳـﺎﻧﯩﻨﻰ ﺋﺎﻟﯩـﺪﯗ. ﺩﯦـﻤﻪﻙ، ‪ Count‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩـﺴﻰ‬ ‫ﻣﻪﻧــﺒﻪ ﺗﯩﺰﻣــﺎ ﺋﯩﭽﯩــﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭﻧﯩــﯔ ﺳــﺎﻧﯩﻨﻰ‬ ‫ﻣﻪﺷﻐﯘﻻﺗﭽﯩــﺴﯩﻨﯩﯔ ﻳﻪﻧﻪ ﺑﯩــﺮ ﺧﯩــﻞ ﺋﻪﻧﺪﯨﺰﯨــﺴﻰ ﺑﻮﻟــﯘﭖ، ﺋــﯘ ﻣﻪﻧــﺒﻪ ﺗﯩﺰﻣﯩــﺪﯨﻜﻰ ﻣﻪﻟــﯘﻡ ﺷــﻪﺭﺗﻨﻰ‬ ‫ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﺪﯛﺭﮔﻪﻥ ﺋﻪﺯﺍﻻﺭ ﺳﺎﻧﯩﻨﻰ ﺗﯧﭙﯩﭗ ﺑﯧﺮﯨﺪﯗ. ﻣﻪﺳﯩﻠﻪﻥ: ﺧﯧﺮﯨﺪﺍﺭﻻﺭ ﺋﺎﺭﯨـﺴﯩﺪﺍ ﺯﺍﻛﺎﺯﻧﯩـﯔ ﺳـﺎﻧﻰ‬ ‫ﺋﯩﻜﻜﯩﮕﻪ ﺗﻪﯓ ﺑﻮﻟﻐﺎﻧﻼﺭﻧﯩﯔ ﺳﺎﻧﯩﻨﻰ ﺗﯧﭙﯩﭗ ﺑﺎﻗﺎﻳﻠﻰ:‬ ‫;)2 == )(‪int equalTwo = customers.Count(c => c.Orders.Count‬‬ ‫ ;))(‪Console.WrieteLine(equalTwo.ToString‬‬ ‫‪ LongCount‬ﻧﯩــﯔ ﺋﯩﻘﺘﯩــﺪﺍﺭﻯ ‪ Count‬ﺑﯩــﻠﻪﻥ ﺋﻮﺧــﺸﺎﺵ ﺑﻮﻟــﯘﭖ، ﻗﺎﻳﺘﯘﺭﯨــﺪﯨﻐﺎﻥ ﻗﯩﻤﻤﯩﺘــﻰ ‪long‬‬ ‫ﺗﯩﭙﻠﯩﻖ، ﺧﺎﻻﺱ. )‪ long‬ﺗﯩﭙﻨﯩﯔ ﺳﯩﻐﯩﻤﻰ ‪ int‬ﺩﯨﻦ ﻳﯘﻗﯩﺮﻯ(‬ ‫‪ Sum‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ )ﻳﯩﻐﯩﻨﺪﺍ(‬ ‫ﺑﯘ ﻣﻪﺷﻐﯘﻻﺗﭽﻰ ﺳﻪﻝ ﺋﺎﻻﮬﯩﺪﯨﺮﻩﻙ. ﺋﺎﯞﺍﻝ ﺋﯘﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﯨﻨﻰ ﻛﯚﺭﯛﭖ ﺋﯚﺗﻪﻳﻠﻰ:‬ ‫ (‪public static Numeric Sum‬‬ ‫ ;)‪    this IEnumerable source‬‬ ‫ (>‪public static Numeric Sum source‬‬ ‫;)‪    Func selector‬‬ ‫ﺋﯘﻧﯩــﯔ ﻗﺎﻳﺘﻤــﺎ ﻗﯩﻤﻤﯩﺘــﻰ ﻳــﺎﻛﻰ ﺋﯩﻜﻜﯩﻨﭽــﻰ ﺋﻪﻧﺪﯨﺰﯨــﺪﯨﻜﻰ ﭘــﺎﺭﺍﻣﯧﺘﯩﺮﻯ ﺑﻮﻟــﺴﯘﻥ ﺋﯘﻻﺭﻧﯩــﯔ ﺗﯩﭙــﻰ‬ ‫‪ Numeric‬ﺋﯩﻜﻪﻥ. ﺑﯘ ﻳﻪﺭﺩﯨﻜﻰ ‪ Numeric‬ﺑﻮﻟﺴﺎ »ﺳﺎﻧﻠﯩﻖ« ﺩﯦـﮕﻪﻥ ﻣﻪﻧﯩـﺪﻩ ﺑﻮﻟـﯘﭖ، ,?‪int, int‬‬ ‫?‪ long, long?, float, float?, double, double?, decimal,decimal‬ﻻﺭﻧﯩﯔ ﺧﺎﻟﯩﻐﺎﻥ ﺑﯩﺮﯨﻨـﻰ‬ ‫ﻛﯚﺭﺳﯩﺘﯩﺪﯗ. ‪ int‬ﻏﯘ ﭘﯜﺗﯜﻥ ﺳﺎﻥ ﺗﯩﭙﻰ، ﺋﻪﻣﯩﺴﻪ ?‪ int‬ﭼﯘ؟‬ ‫0.2#‪ C‬ﺩﯨــﻦ ﺗﺎﺭﺗﯩــﭗ ﻗﯩﻤﻤﻪﺗﻠﯩــﻚ ﺗﯩﭙﻠﯩــﻖ ﺋﯚﺯﮔﻪﺭﮔــﯜﭼﻰ ﻣﯩﻘــﺪﺍﺭﻻﺭﻏﺎ ﮬﯩــﭻ ﻗﺎﻧــﺪﺍﻕ ﻗﯩﻤــﻤﻪﺕ‬ ‫ﻳﻮﻟﻼﻧﻤﺎﻳــﺪﯨﻐﺎﻥ ﮬــﺎﻟﻪﺗﻨﻰ ﺋﯩﭙــﺎﺩﯨﻠﻪﺵ ﺯﯙﺭﯛﺭﯨﻴﯩﺘﯩــﺪﯨﻦ)ﺑﻮﻟﯘﭘﻤــﯘ ﺳــﺎﻧﺪﺍﻧﺪﯨﻜﻰ ﻗــﯘﺭﯗﻕ ‪ int‬ﺗﯩﭙﯩﻐــﺎ‬ ‫ﻣﺎﺳﻼﺷﺘﯘﺭﯗﺵ( ﺷﯘ ﺗﯩﭗ ﺧﺎﺱ ﺳﯚﺯﯨﻨﯩﯔ ﺋﺎﺭﻗﯩـﺴﯩﻐﺎ ﺳـﯘﺋﺎﻝ ﺑﻪﻟﮕﯩـﺴﻰ ﺋـﺎﺭﻗﯩﻠﯩﻖ )?‪ T‬ﺩﻩﻙ( ﻗـﯘﺭﯗﻕ‬ ‫ﺑﻮﻻﻻﻳﺪﯨﻐﺎﻥ ﺗﯩﭗ ﮬﺎﻟﯩﺘﯩﻨﻰ ﺋﯩﭙﺎﺩﯨﻠﻪﻳﺪﯗ )ﺋﯘﻧﯩﯔ ﺗﯩﭙﻰ >‪ .(Nullable23‪ Nullable  o.OrderAmount) };  ،‫ ﺗﯩﺰﻣﯩــﺴﻰ ﺑﯩــﻠﻪﻥ ﮬﻪﻣــﺪﻩﻣﻠﻪﭖ‬customersOrders ‫ ﺗﯩﺰﻣﯩــﺴﯩﻨﻰ‬customers ‫ﺋﯜﺳــﺘﯩﺪﯨﻜﻰ ﻣﯩــﺴﺎﻟﺪﺍ‬ .‫ﮬﻪﺭﺑﯩﺮ ﺧﯧﺮﯨﺪﺍﺭﻧﯩﯔ ﺯﺍﻛﺎﺯ ﺳﺎﻧﯩﻐﺎ ﺋﯧﺮﯨﺸﯩﭗ ﺋﯘﻻﺭﻧﻰ ﻗﻮﺷﯘﺵ ﻧﻪﺗﯩﺠﯩﺴﯩﻨﻰ ﺋﺎﻟﺪﯗﻕ‬ :‫ﺋﺎﺩﻩﺗﺘﻪ ﻳﯘﻗﯩﺮﯨﻘﻰ ﻛﻮﺩﻧﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﺋﯩﭙﺎﺩﯨﻠﻪﻳﻤﯩﺰ‬ 4.31 ‫ﻛﻮﺩ‬ var expr =      from   c in customers      join   o in (             from c in customers                 from   o in c.Orders                 join   p in products                        on o.IdProduct equals p.IdProduct                 select new { c.Name, OrderAmount = o.Quantity *  p.Price }             ) on c.Name equals o.Name  www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 62            into customersWithOrders      select new { c.Name,                   TotalAmount = customersWithOrders.Sum(o =>  o.OrderAmount) }; ‫ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩﺴﻰ‬Linq vs. SQL ‫ﻳﯧﺰﯨﭗ ﻣﯘﺷﯘ ﻳﻪﺭﮔﻪ ﻛﻪﻟﮕﻪﻧﺪﻩ، ﺋﯩﻜﻜﯩﺴﯩﻨﻰ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﭖ ﺑﯧﻘﯩﺸﻨﻰ ﺗﻮﻏﺮﺍ ﺗﺎﭘﺘﯩﻢ، ﭼـﯜﻧﻜﻰ ﺋـﯘﻻﺭ‬ ‫ﺋﻮﺧﺸﯩــﺸﯩﭗ ﻛﯧﺘﯩﺪﯨﻐﺎﻧــﺪﻩﻙ ﺗﯘﺭﺳــﯩﻤﯘ ﺋﺎﺭﯨــﺴﯩﺪﺍ ﺋﯩﻨﺘــﺎﻳﯩﻦ ﻣــﯘﮬﯩﻢ ﭘﻪﺭﻕ ﺑــﺎﺭ. ﺑــﻮ ﺗﻮﻏﺮﯨﻠﯩــﻖ‬ .‫ﺗﻮﺧﺘﯩﻠﯩﺸﻨﯩﯔ ﮬﺎﺟﯩﺘﻰ ﺑﺎﺭ ﺩﻩﭖ ﺋﻮﻳﻠﯩﺪﯨﻢ‬ .‫ ﺋﯩﭙﺎﺩﯨـﺴﻰ‬Sql ‫ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺴﻰ ﻛﻮﺩ 13.4 ﺩﯨﻜﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﮕﻪ ﺋﻮﺧﺸﺎﭖ ﻛﯧﺘﯩـﺪﯨﻐﺎﻥ‬ :(‫)ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﯩﯔ ﺋﯩﺴﯩﻤﻰ ﺑﯩﺮﺩﯨﻦ-ﺑﯩﺮ ﺩﻩﭖ ﭘﻪﺭﻩﺯ ﻗﯩﻠﯩﻨﺪﻯ‬ SELECT   c.Name, SUM(o.OrderAmount) AS OrderAmount  FROM     customers AS c  INNER JOIN (      SELECT     c.Name, o.Quantity * p.Price AS OrderAmount      FROM       customers AS c      INNER JOIN orders AS o ON c.Name = o.Name      INNER JOIN products AS p ON o.IdProduct = p.IdProduct      ) AS o  ON       c.Name = o.Name  GROUP BY c.Name ‫ ﺟﯜﻣﻠﯩﻠﯩﺮﯨﻨﯩﯔ ﻧﻪﻗﻪﺩﻩﺭ ﻛﯧﻠﻪﯕﺴﯩﺰ ﺋﯩﻜﻪﻧﻠﯩﻜﯩﻨﻰ ﮬﯧﺲ ﻗﯩﻠﻐﺎﻧـﺴﯩﺰ!. ﺋﻪﻣﻪﻟﯩﻴﻪﺗـﺘﻪ‬Sql ‫ﻳﯘﻗﯩﺮﯨﻘﻰ‬ :‫ ﺋﯩﭙﺎﺩﯨﺴﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺋﻮﺧﺸﺎﺵ ﻧﻪﺗﯩﺠﯩﮕﻪ ﺋﯧﺮﯨﺸﻪﻟﻪﻳﻤﯩﺰ‬Sql ‫ﺋﯘﻧﯩﺪﯨﻦ ﺋﺎﺩﺩﯨﺮﺍﻕ‬ SELECT   c.Name, SUM(o.OrderAmount) AS OrderAmount  FROM     customers AS c  INNER JOIN (      SELECT     o.Name, o.Quantity * p.Price AS OrderAmount      FROM       orders AS o      INNER JOIN products AS p ON o.IdProduct = p.IdProduct      ) AS o  ON       c.Name = o.Name  GROUP BY c.Name  :‫ﻟﯧﻜﯩﻦ ﺗﯧﺨﯩﻤﯘ ﻗﯩﺴﻘﺎ، ﺗﯧﺨﯩﻤﯘ ﺋﺎﺩﺩﻯ ﺋﯩﭙﺎﺩﯨﻠﯩﻴﻪﻟﻪﻳﻤﯩﺰ‬ SELECT     c.Name, SUM(o.Quantity * p.Price) AS OrderAmount  FROM       customers AS c  ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫36‬ ‫ ‪INNER JOIN orders AS o ON c.Name = o.Name‬‬ ‫ ‪INNER JOIN products AS p ON o.IdProduct = p.IdProduct‬‬ ‫‪GROUP BY   c.Name‬‬ ‫ﺋﻪﮔﻪﺭ ﺑﯩﺰ ﺋﯜﭼﯩﻨﭽﻰ ﺧﯩﻞ ‪ Sql‬ﭼﻪ ﺋﯩﭙﺎﺩﯨﻠﻪﺵ ﺋﯘﺳﯘﻟﯩﻨﻰ ‪ Linq‬ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﯩﺪﻩ‬ ‫ﺋﯩﭙﺎﺩﯨﻠﯩﻤﻪﻛﭽﻰ ﺑﻮﻟﺴﺎﻕ ﺑﯩﺮ ﻗﯩﺴﯩﻢ ﻗﯧﻴﯩﻨﭽﯩﻠﯩﻘﻼﺭﻏﺎ ﺩﯗﭺ ﻛﯧﻠﯩﺸﯩﻤﯩﺰ ﻣﯘﻣﻜﯩﻦ. ﺳﻪﯞﻩﺑﻰ، ‪Sql‬‬ ‫ﺑﻮﻟﺴﺎ ﺋﯘﭼﯘﺭﻻﺭﻧﻰ ﻣﯘﻧﺎﺳﯩﯟﯨﺘﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺳﯜﺭﯛﺷﺘﯜﺭﯨﺪﯗ، ﺑﺎﺭﻟﯩﻖ ﺋﯘﭼﯘﺭﻻ ﺗﺎﻛﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻟﮕﻪﻧﮕﻪ‬ ‫ﻗﻪﺩﻩﺭ ﺗﻪﻛﺸﻰ ﮬﺎﻟﻪﺗﺘﻪ)ﺟﻪﺩﯞﻩﻟﺪﻩ( ﺗﯘﺭﯨﺪﯨﻐﺎﻥ ﺑﻮﻟﯘﭖ ﺋﯘﻻﺭ ﺋﺎﺭﯨﺴﯩﺪﺍ ﺩﻩﺭﯨﺠﻪ، ﻳﻪﻧﻰ ﺗﻪﯞﻩﻟﯩﻚ‬ ‫ﻣﯘﻧﺎﺳﯩﯟﯨﺘﻰ ﺋﯩﭙﺎﺩﯨﻠﻪﻧﻤﻪﻳﺪﯗ. ﺑﯩﺮﺍﻕ ‪ Linq‬ﺑﻮﻟﺴﺎ ﺧﯘﺩﺩﻯ ﺧﯧﺮﯨﺪﺍﺭ\ﺯﺍﻛﺎﺯﻻﺭ\ﻣﻪﮬﺴﯘﻻﺗﻼﺭ ﻏﺎ‬ ‫ﺋﻮﺧﺸﺎﺵ ﻳﻪﺭﻟﯩﻚ ﺩﻩﺭﯨﺠﻪ، ﻳﻪﻧﻰ ﺗﻪﯞﻩﻟﯩﻚ ﻣﯘﻧﺎﺳﯩﯟﯦﺘﻰ ﺑﻮﻟﻐﺎﻥ ﺋﯘﭼﯘﺭﻻﺭﻏﺎ ﻣﻪﺷﻐﯘﻻﺕ ﺋﯧﻠﯩﭗ‬ ‫ﺑﺎﺭﯨﺪﯗ. ﺑﯘ ﭘﻪﺭﻕ ﺋﯩﻜﻜﻰ ﺧﯩﻞ ﺋﯘﺳﯘﻟﻨﯩﯔ ﺋﻮﺧﺸﯩﻤﯩﻐﺎﻥ ﺷﺎﺭﺍﺋﯩﺘﺘﺎ ﺋﯚﺯﯨﮕﻪ ﺧﺎﺱ ﺋﺎﺭﺗﯘﻗﭽﯩﻠﯩﻘﯩﻨﯩﯔ‬ ‫ﺑﺎﺭﻟﯩﻘﯩﻨﻰ ﭼﯜﺷﻪﻧﺪﯛﺭﯨﺪﯗ. ﻳﻪﻧﻰ ﺋﺎﺭﺗﯘﻗﭽﯩﻠﯩﻘﻰ ﺳﯩﺰﻧﯩﯔ ﻗﺎﻧﺪﺍﻕ ﺋﯘﭼﯘﺭﻏﺎ ﻗﺎﻧﺪﺍﻕ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﺵ‬ ‫ﺋﯧﻠﯩﭗ ﺑﺎﺭﯨﺪﯨﻐﺎﻧﻠﯩﻘﯩﯖﯩﺰ ﺗﻪﺭﯨﭙﯩﺪﯨﻦ ﺑﻪﻟﮕﯩﻠﯩﻨﯩﺪﯗ.‬ ‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﺳﻪﯞﻩﺑﻠﻪﺭ ﺗﯜﭘﻪﻳﻠﻰ ﺋﻮﺧﺸﺎﺵ ﻣﻪﻧﺒﻪﺩﯨﻦ ﺋﻮﺧﺸﺎﺵ ﻧﻪﺗﯩﺠﯩﮕﻪ ﺋﯧﺮﯨﺸﯩﺪﯨﻐﺎﻥ ﺧﯩﻞ)ﺋﻪﯓ‬ ‫ﻳﺎﺧﺸﯩﻼﻧﻐﯩﻨﻰ( ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ‪ Sql‬ﺑﯩﻠﻪﻥ ‪ Linq‬ﺩﺍ ﭘﻪﺭﻗﻠﯩﻖ ﻳﯧﺰﯨﻠﯩﺪﯗ.‬ ‫‪Min and Max‬‬ ‫ﺟﻪﻣﻠﻪﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺋﯩﭽﯩﺪﯨﻜﻰ ‪ Max‬ﺑﯩﻠﻪﻥ ‪ Min‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﺎ ﺋﯩﭽﯩﺪﯨﻜﻰ ﺋﻪﯓ‬ ‫ﭼﻮﯓ ﯞﻩ ﺋﻪﯓ ﻛﯩﭽﯩﻚ ﺋﻪﺯﺍﻧﻰ ﺗﯧﭙﯩﺸﻘﺎ ﺋﯩﺸﻠﺘﯩﻠﯩﺪﯗ. ﺋﯘﻻﺭﻣﯘ ﺑﯩﺮﻗﺎﻧﭽﻪ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﻠﻪﻧﮕﻪﻥ:‬ ‫ (‪public static Numeric Min/Max‬‬ ‫ ;)‪    this IEnumerable source‬‬ ‫ (>‪public static T Min/Max source‬‬ ‫ (>‪public static Numeric Min/Max source‬‬ ‫ ;)‪    Func selector‬‬ ‫ (>‪public static S Min/Max source‬‬ ‫ ;)‪    Func selector‬‬ ‫ﺑﯩﺮﯨﻨﭽﻰ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﺪﻩ ﺋﻪﺯﺍﻻﺭﻏﺎ ﻧﯩﺴﺒﻪﺗﻪﻥ ﺋﺎﺭﻯ ﻣﯧﺘﯩﻜﯩﻠﯩﻖ ﺳﯧﻠﯩـﺸﺘﯘﺭﯗﺵ ﺋﯧﻠﯩـﭗ ﺑﺎﺭﯨـﺪﯗ. ﺷـﯘﯕﺎ‬ ‫ﻣﻪﺯﻛﯘﺭ ﺋﻪﻧﺪﯨﺰﯨﻨﻰ ﺋﻪﺯﺍﻟﯩﺮﻯ ﺳﺎﻥ ﺑﻮﻟﻐﺎﻥ ﺗﯩﺰﻣﯩﻼﺭﻏـﺎ ﺋﯩـﺸﻠﯩﺘﯩﺶ ﻣﯘﯞﺍﭘﯩـﻖ. ﻣﻪﺳـﯩﻠﻪﻥ: ﺗﯚﯞﻩﻧـﺪﯨﻜﻰ‬ ‫ﻣﯩﺴﺎﻟﺪﺍ ﺑﺎﺭﻟﯩﻖ ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﯩﯔ ﺑﺎﺭﻟﯩﻖ ﺯﺍﻛﺎﺯﻟﯩﺮﯨﻨﯩﯔ ﻣﯩﻘـﺪﺍﺭﯨﻐﺎ ﻧﯩـﺴﺒﻪﺗﻪﻥ ﺋﻪﯓ ﻛﯩﭽﯩﻜﯩﻨـﻰ ﺗﯧـﭙﯩﺶ‬ ‫ﻣﻪﺷﻐﯘﻻﺗﻰ ﺋﯧﻠﯩﭗ ﺑﯧﺮﯨﻠﯩﺪﯗ:‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫46‬ ‫ﻛﻮﺩ 23.4‬ ‫ = ‪var expr‬‬ ‫ ‪    (from c in customers‬‬ ‫ ‪         from   o in c.Orders‬‬ ‫ ‪         select o.Quantity‬‬ ‫ ;)(‪    ).Min‬‬ ‫ﺋﯩﻜﻜﯩﻨﭽﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﯨﺪﻩ ﺋﻪﺯﺍﻻﺭﻧﯩـﯔ ﺗﯩﭙﯩﻨـﻰ ﺋﯧﺘﯩﯟﺍﺭﻏـﺎ ﺋﺎﻟﻤـﺎﻱ ﭼـﻮﯓ- ﻛﯩﭽﯩﻜﯩﻨـﻰ ﺗﺎﭘﯩـﺪﯗ.‬ ‫)ﺋﻪﻟﯟﻩﺗﺘﻪ، ﭼﻮﯓ- ﻛﯩﭽﯩﻜﯩﻨﻰ ﺗﯧﭙﯩﺶ ﺋﯜﭼﯜﻥ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﺵ ﺋﯧﻠﯩـﭗ ﺑﯧـﺮﯨﺶ ﻛﯧـﺮﻩﻙ( ﺋﻪﮔﻪﺭ ﻣﻪﻧـﺒﻪ‬ ‫ﺗﯩﺰﻣﯩــﺪﯨﻜﻰ ﺋﻪﺯﺍ ﺗﯩﭙــﻰ >‪ IComparable o.Quantity‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫56‬ ‫‪ Average‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ‬ ‫ﻣﻪﺯﻛﯘﺭ ﻣﻪﺷﻐﯘﻻﺗﭽﻰ ﺋﻪﺯﺍ ﻗﯩﻤﻤﻪﺗﻠﯩﺮﻧﯩﯔ ﺋﻮﺗﺘﯘﺭﭼﻪ ﻗﯩﻤﻤﯩﺘﯩﻨﻰ ﺗﺎﭘﯩﺪﯗ. ﺋﯘ ﺋﺎﻟﺪﯨﺪﺍ ﺳﯚﺯﻟﯩﮕﻪﻥ ,‪Max‬‬ ‫‪ Min, Sum‬ﻻﺭﻏـﺎ ﺋﻮﺧـﺸﺎﺵ ﺋﻪﺯﺍﻻﺭﻧﯩ ـﯔ ﻗﯩﻤﻤﻪﺗﻠﯩـﻚ ﺗﯩـﭗ ﺑﻮﻟﻐ ـﺎﻥ ﮬـﺎﻟﯩﺘﯩﮕﻪ ﻣﯘﯞﺍﭘﯩـﻖ. ﺋﯘﻧ ـﺪﺍﻕ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﻮﻟﻤﯩﻐــﺎﻥ ﺋﻪﮬــﯟﺍﻝ ﺋﺎﺳــﺘﯩﺪﺍ ﺑﺎﺷــﻘﺎ ﺋﻪﻧــﺪﯨﺰﯨﻠﯩﺮﻯ ﺋــﺎﺭﻗﯩﻠﯩﻖ ﻛــﯚﭖ ﺧﺎﺳــﻠﯩﻖ ﭼﺎﻗﯩﺮﯨﻠﻤــﺎ ﺗﯩﭙﻨﯩــﯔ‬ ‫ﻗﯩﻤﻤﻪﺗﻠﯩﻚ ﺧﺎﺳﻠﯩﻘﯩﻨﻰ ﺑﻪﻟﮕﯩﻠﻪﭖ ﻗﻮﻳﯘﺵ ﻛﯧـﺮﻩﻙ. ﺷـﯘﻧﺪﯨﻼ ﻧﻮﺭﻣـﺎﻝ ﻣﻪﺷـﻐﯘﻻﺕ ﺋﯧﻠﯩـﭗ ﺑﺎﺭﺍﻻﻳـﺪﯗ.‬ ‫ﺋﯘﻧﯩﯔ ﺗﯚﯞﻩﻧﺪﻩ ﻛﯚﺭﺳﯩﺘﯩﻠﮕﻪﻧﺪﻩﻙ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ ﺑﺎﺭ:‬ ‫ (‪public static Result Average‬‬ ‫ ;)‪    this IEnumerable source‬‬ ‫ (>‪public static Result Average source‬‬ ‫;)‪    Func selector‬‬ ‫ﺋﻮﺗﺘﯘﺭﭼﻪ ﻗﯩﻤﻤﯩﺘﻰ ﺋﯧﻠﯩﻨﻤﺎﻗﭽﻰ ﺑﻮﻟﻐﺎﻥ ‪ Numeric‬ﺗﯩﭗ ,?‪int, int?, long, long?, float, float‬‬ ‫.?‪ double, double?, decimal, or decimal‬ﻻﺭﻧﯩﯔ ﺑﯩﺮﻯ ﺑﻮﻟﯘﺷﻰ ﻛﯧﺮﻩﻙ. ﺷﯘﻧﺪﺍﻕ ﺑﻮﻟﻐﺎﻧﺪﺍ‬ ‫ﻧﻪﺗﯩﺠﻪ ﻣﻪﻧﺒﻪ ﺗﯩﭙﻘﺎ ﯞﺍﺭﯨﺴﻠﯩﻖ ﻗﯩﻠﯩﭙﻼ ﻗﺎﻟﻤﺎﻱ، ﻗﯘﺭﯗﻕ ﺑﻮﻻﻻﻳﺪﯨﻐﺎﻥ ﺋﺎﻻﮬﯩﺪﯨﻠﯩﻜﯩﻨﯩﻤﯘ ﺳﺎﻗﻼﭖ ﻗﺎﻟﯩﺪﯗ.‬ ‫ﺋﯘﻧﯩﯖﺪﯨﻦ ﺑﺎﺷﻘﺎ، ﻣﻪﻧﺒﻪﺩﯨﻜﻰ ﺋﻪﺯﺍ ‪ int‬ﻳﺎﻛﻰ ‪ long‬ﺗﯩﭙﻠﯩﻖ ﺑﻮﻟﺴﺎ، ﻧﻪﺗﯩﺠﻪ ‪ double‬ﺗﯩﭙﻠﯩﻖ؛‬ ‫ﻣﻪﻧﺒﻪﺩﯨﻜﻰ ﺋﻪﺯﺍ ?‪ int‬ﻳﺎﻛﻰ ?‪ long‬ﺗﯩﭙﻠﯩﻖ ﺑﻮﻟﺴﺎ، ﻧﻪﺗﯩﺠﻪ ?‪ double‬ﺗﯩﭙﻠﯩﻖ ﺑﻮﻟﯩﺪﯗ.‬ ‫ﺑﯘﻧﺪﺍﻕ ﺑﻮﻟﯩﺸﯩﻨﻰ ﭼﯜﺷﯜﻧﯜﺵ ﺗﻪﺱ ﺋﻪﻣﻪﺱ، ﻳﻪﻧﻰ، ﺑﯩﺮﻗﺎﻧﭽﻪ ﭘﯜﺗﯜﻥ ﺳﺎﻧﻨﯩﯔ ﺋﻮﺗﺘﯘﺭﯨﭽﻪ ﻗﯩﻤﻤﯩﺘﻰ‬ ‫ﻛﻪﺳﯩﺮ ﺳﺎﻥ ﭼﯩﻘﯩﺸﻰ ﻣﯘﻣﻜﯩﻦ.‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺴﻰ ﺋﯩﻜﻜﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﮕﻪ ﺑﯩﺮﺩﯨﻦ ﻣﯩﺴﺎﻝ:‬ ‫ﻛﻮﺩ 53.4 ‪ Average‬ﻧﯩﯔ ﺋﯩﻜﻜﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﻰ ﻣﻪﮬﺴﯘﻻﺕ ﺑﺎﮬﺎﻟﯩﺮﯨﻐﺎ ﻣﻪﺷﻐﯘﻻﺕ ﺋﯧﻠﯩﭗ ﺑﺎﺭﯨﺪﯗ‬ ‫ = ‪var expr‬‬ ‫ ‪    (from p in products‬‬ ‫ ‪    select p.Price‬‬ ‫ ;)(‪    ).Average‬‬ ‫ = ‪var expr‬‬ ‫ ‪    (from p in products‬‬ ‫ } ‪    select new { p.Price‬‬ ‫ ;)‪    ).Average(p => p.Price‬‬ ‫ﺋﯩﻜﻜﯩﻨﭽﻰ ﻣﯩﺴﺎﻟﯩﺪﯨﻜﻰ ﻛﯚﻙ ﺭﻩﯕﮕﻪ ﺑﻮﻳﺎﻟﻐـﺎﻥ ﺳﯜﺭﯛﺷـﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨـﺴﯩﻨﯩﯔ ﻧﻪﺗﯩﺠﯩـﺴﯩﮕﻪ ‪Average‬‬ ‫ﻧﯩﯔ ﺋﯩﻜﻜﯩﻨﭽﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﻨﻰ ﺋﯩﺸﻠﯩﺘﯩﺸﺘﯩﻜﻰ ﺳﻪﯞﻩﺏ، ﺋﯘﻧﯩـﯔ ﻧﻪﺗﯩـﺠﻪ ﺗﯩﺰﻣﯩـﺴﯩﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭ‬ ‫ﻧﺎﻣــﺴﯩﺰ ﺗﯩﭙﻠﯩــﻖ ﺑﻮﻟﻐــﺎﻧﻠﯩﻘﻰ ﺋﯜﭼــﯜﻥ ﺋــﯘﻻﺭ ﺋﺎﺭﯨــﺴﯩﺪﺍ ﺑﯩﯟﺍﺳــﺘﻪ ﺋــﺎﺭﻓﯩﻤﯧﺘﯩﻜﯩﻠﯩﻖ ﺋﻪﻣﻪﻝ ﺑﯩﺠﯩﺮﮔﯩﻠــﻰ‬ ‫ﺑﻮﻟﻤﺎﻳـﺪﯗ. ﺷـﯘﯕﺎ ﭼﻮﻗـﯘﻡ ﺋﯘﻧﯩـﯔ ﻗﺎﻳـﺴﻰ ﺧﺎﺳـﻠﯩﻘﯩﻨﯩﯔ ﺋﻮﺗﺘـﯘﺭﯨﭽﻪ ﻗﯩﻤﻤﯩﺘﯩﻨـﻰ ‪ lambda‬ﺋﯩﭙﺎﺩﯨـﺴﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﺎﺭﻗﯩﻠﯩﻖ ﺑﻪﻟﮕﯩﻠﻪﭖ ﺑﯧﺮﯨﺸﯩﻤﯩﺰ ﻛﯧﺮﻩﻙ.‬ ‫ﺗﯚﯞﻩﻧﺪﻩ ﺑﺎﺭﻟﯩﻖ ﺧﯧﺮﯨﺪﺍﺭﻻﺭ ﯞﻩ ﺋﯘﻻﺭﻧﯩﯔ ﺯﺍﻛـﺎﺯ ﻣﯩﻘـﺪﺍﺭﻟﯩﺮﯨﻨﯩﯔ ﺋﻮﺗﺘـﯘﺭﭼﻪ ﻗﯩﻤﻤﯩﺘﯩﻨـﻰ ﭼﯩﻘﯩﺮﯨـﺪﯨﻐﺎﻥ‬ ‫ﻣﯩﺴﺎﻝ ﺑﯧﺮﯨﻠﺪﻯ:‬ www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 66 4.36 ‫ﻛﻮﺩ‬ var expr =      from   c in customers      join   o in (             from c in customers                 from   o in c.Orders                 join   p in products                        on o.IdProduct equals p.IdProduct                 select new { c.Name, OrderAmount = o.Quantity *  p.Price }             ) on c.Name equals o.Name             into customersWithOrders      select new { c.Name,                   AverageAmount = customersWithOrders.Average(o =>  o.OrderAmount) };  :‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﻣﯩﺴﺎﻟﻨﯩﯔ ﻧﻪﺗﯩﺠﯩﺴﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﺑﻮﻟﯘﺷﻰ ﻣﯘﻣﻜﯩﻦ‬ {Name=Paolo, AverageAmount=65}  {Name=Marco, AverageAmount=350}  {Name=James, AverageAmount=600}  {Name=Frank, AverageAmount=1000} ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫76‬ ‫‪ Generation‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﻗﯘﺭﻏﯘﭺ(‬ ‫ﻣﻪﺳﯩﻠﻪﻥ 0002-ﻳﯩﻠﯩﺪﯨﻦ 7002-ﻳﯩﻠﯩﻐﯩﭽﻪ ﺑﻮﻟﻐـﺎﻥ ﺋـﺎﺭﻟﯩﻘﺘﯩﻜﻰ ﺯﺍﻛـﺎﺯﻻﺭ ﺗﯩﺰﯨﻤﻠﯩﻜﯩﻨـﻰ ﭼﯩﻘﯩـﺮﯨﺶ،‬ ‫ﻳﺎﻛﻰ ﺋﻮﺧﺸﺎﺵ ﺑﯩﺮ ﺋﯘﭼﯘﺭﻏﺎ ﺋﻮﺧـﺸﺎﺵ ﺑﯩـﺮ ﻣﻪﺷـﻐﯘﻻﺗﻨﻰ ﺗﻪﻛـﺮﺍﺭ ﺋﯧﻠﯩـﭗ ﺑﯧﺮﯨـﺸﺘﻪﻙ ﻣﻪﺷـﻐﯘﻻﺗﻼﺭﻧﻰ‬ ‫ﻗﯘﺭﻏﯘﭺ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺋﯩﻨﺘﺎﻳﯩﻦ ﺋﻪﭘﭽﯩﻠﻠﯩﻚ ﺑﯩﻠﻪﻥ ﺋﯧﻠﯩﭗ ﺑﺎﺭﺍﻻﻳﺪﯗ.‬ ‫‪) Range‬ﺩﺍﺋﯩﺮﻩ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ(‬ ‫ﺋــﯘ ﺑﻪﻟﮕﯩﻠﯩــﻚ ﺩﺍﺋﯩﺮﯨــﺪﯨﻜﻰ ﻗﯩﻤﻤﻪﺗــﻠﻪﺭ ﺗﯩﺰﻣﯩــﺴﻰ ﮬﺎﺳــﯩﻞ ﻗﯩﻠﯩــﭗ ﺑﯧــﺮﯨﺶ ﺭﻭﻟﯩﻐــﺎ ﺋــﯧﮕﻪ ﺑﻮﻟــﯘﭖ،‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﺑﯩﺮﺩﯨﻦ- ﺑﯩﺮ ﺋﻪﻧﺪﯨﺰﯨﮕﻪ ﺋﯩﮕﻪ:‬ ‫ (‪public static IEnumerable Range‬‬ ‫ ,‪    int start‬‬ ‫;)‪    int count‬‬ ‫ﻛﻮﺩ 04.4 ﺩﺍ 5002-ﻳﯩﻠﺪﯨﻦ 7002-ﻳﯩﻠﻐﯩـﭽﻪ ﺋـﺎﺭﻟﯩﻘﺘﯩﻜﻰ ﺯﺍﻛـﺎﺯﻻﺭﻧﻰ ﺳـﯜﺯﯛﭖ ﺋـﯧﻠﯩﺶ ﻣﻪﺷـﻐﯘﻻﺕ‬ ‫ﻛﻮﺩﻯ ﺑﯧﺮﯨﻠﺪﻯ.‬ ‫ﺋﻪﺳـﻜﻪﺭﺗﯩﺶ: ﻣﻪﺯﻛـﯘﺭ ﻣﻪﺳـﯩﻠﯩﮕﻪ ﻧﯩـﺴﺒﻪﺗﻪﻥ ‪ where‬ﺧـﺎﺱ ﺳـﯚﺯﻯ ﺋـﺎﺭﻗﯩﻠﯩﻖ ﻳﯩـﻞ ﭼﯧﻜـﻰ ﻗﻮﻳـﯘﺵ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﻪﻗﯩﻠﮕﻪ ﺋﻪﯓ ﻣﯘﯞﺍﭘﯩﻖ ﺋﯘﺳﯘﻝ. ﺑﯘ ﻛـﻮﺩ ﭘﻪﻗﻪﺕ ‪ Range‬ﻧﯩـﯔ ﺋﯩـﺸﻠﯩﺘﯩﺶ ﺋﯘﺳـﯘﻟﯩﻨﻰ ﭼﯜﺷـﻪﻧﺪﯛﺭﯛﺵ‬ ‫ﻣﻪﻗﺴﯩﺘﯩﺪﻩ ﻣﯩﺴﺎﻝ ﺋﯜﭼﯜﻧﻼ ﺑﯧﺮﯨﻠﺪﻯ، ﻟﯧﻜﯩﻦ ﻳﺎﺧﺸﻰ ﺋﯘﺳﯘﻝ ﺑﻮﻟﯘﺷﻰ ﻧﺎﺗﺎﻳﯩﻦ.‬ ‫ﻛﻮﺩ 04.4 5002-ﻳﯩﻠﯩﺪﯨﻦ 7002-ﻳﯩﻠﻐﯩﭽﻪ ﺑﻮﻟﻐﺎﻥ ﺯﺍﻛﺎﺯﻻﺭﻏﺎ ﺋﯧﺮﯨﺸﯩﺶ‬ ‫ = ‪var expr‬‬ ‫ )3 ,5002(‪    Enumerable.Range‬‬ ‫ ‪    .SelectMany(x => (from   o in orders‬‬ ‫ ‪                      where  o.Year == x‬‬ ‫ ;))} ‪                      select new { o.Year, o.Amount‬‬ ‫ﻳﯘﻗﯩﺮﯨﻘﯩﻼﺭﺩﯨﻦ ﺑﺎﺷﻘﺎ ‪ Range‬ﻧﻰ ﻳﻪﻧﻪ »ﻛﯘﯞﺍﺩﯨﺮﺍﺕ ﻛﯚﺗﯜﺭﯛﺵ«، »ﮬﻪﺳﺴﯩﻠﻪﺵ« ﯞﻩ ﻓﺎﻛﺘﻮﺭﯨﻴﺎﻟﯩﻨﻰ‬ ‫ﮬﯧﺴﺎﺑﻼﺷﺘﻪﻙ ﺋﻮﺭﯗﻧﻼﺭﻏﯩﻤﯘ ﻗﻮﻟﻠﯩﻨﯩﺸﻘﺎ ﺑﻮﻟﯩﺪﯗ. ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫ﺍﻛﺘﻮﺭﯨﻴﺎﻟﯩﻨﻰ ‪ Range‬ﺩﯨﻦ ﭘﺎﻳﺪﯨﻠﯩﻨﯩﭗ ﺗﯧﭙﯩﺶ‬ ‫ﻛﻮﺩ 14.4 ‪ number‬ﻧﯩﯔ‬ ‫ { )‪static int Factorial(int number‬‬ ‫ )1 + ‪    return (Enumerable.Range(0, number‬‬ ‫ } ;))‪            .Aggregate(0, (s, t) => t == 0 ? 1 : s *= t‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫86‬ ‫‪) Repeat‬ﺗﻪﻛﺮﺍﺭ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ(‬ ‫ﻣﻪﺯﻛــﯘﺭ ﻣﻪﺷــﻐﯘﻻﺗﭽﻰ ﻣﻪﻧــﺒﻪ ﺗﯩﺰﻣﯩــﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭﻧــﻰ ﺗﻪﻛــﺮﺍﺭﻻﭖ ﻛﯚﭘﻪﻳﺘﯩــﺪﯗ. ﺋﻪﮔﻪﺭ ﺋﻪﺯﺍ ﭼﺎﻗﯩﺮﯨﻠﻤــﺎ‬ ‫ﺗﯩﭙﻠﯩـــﻖ ﺑﻮﻟـــﺴﺎ، ﮬﻪﺭ ﺑﯩـــﺮ ﺋﻪﺯﺍﻧﯩـــﯔ ﺋـــﯚﺯﻯ ﺋﻪﻣﻪﺱ ﺑﻪﻟﻜـــﻰ ﻣﯘﻧﺎﺳـــﯩﭗ ﭼﺎﻗﯩﺮﻏﯘﭼﯩـــﺴﻰ)‪(引用‬‬ ‫ﺗﻪﻛﺮﺍﺭﻟﯩﻨﯩﺪﯗ.‬ ‫‪ Repeat‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩــــﺴﻰ ﻛﯚﭘــــﯜﻧﭽﻪ ﺗﯩﺰﻣﯩــــﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭﻧــــﻰ ﺩﻩﺳﻠﻪﭘﻠﻪﺷــــﺘﯜﺭﯛﺵ، ﺋﻮﺧــــﺸﺎﺵ‬ ‫ﺳﯜﺭﯛﺷ ـﺘﯜﺭﯛﻛﻨﻰ ﻧﻪﭼ ـﭽﻪ ﻗﯧ ـﺘﯩﻢ ﺋﯩﺠ ـﺮﺍ ﻗﯩﻠﯩ ـﺸﺘﻪﻙ ﺋﻪﮬ ـﯟﺍﻟﻼﺭﺩﺍ ﺋﯩ ـﺸﻠﯩﺘﯩﻠﯩﺪﯗ. ﺗﯚﯞﻩﻧ ـﺪﯨﻜﻰ ﻣﯩ ـﺴﺎﻟﺪﺍ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﯩﯔ ﺋﯩﺴﯩﻤﻠﯩﺮﯨﻨﻰ ﺋﺎﻟﯩﺪﯨﻐﺎﻥ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﻨﻰ ﺋﯜﭺ ﻗﯧﺘﯩﻢ ﺗﻪﻛﺮﺍﺭ ﺋﯩﺠﺮﺍ ﻗﯩﻠﯩﺪﯗ.‬ ‫ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﻨﻰ ﺗﻪﻛﺮﺍﺭ ﺋﯩﺠﺮﺍ ﻗﯩﻠﯩﺶ‬ ‫ﻛﻮﺩ 24.4‬ ‫ = ‪var expr‬‬ ‫ ‪    Enumerable.Repeat( (from   c in customers‬‬ ‫ )3 ,)‪                      select c.Name‬‬ ‫;)‪.SelectMany(x => x‬‬ ‫           ‬ ‫ )‪foreach (var v in expr‬‬ ‫ ;)‪                Console.WriteLine(v‬‬ ‫ﻳ ـﯘﻗﯩﺮﯨﻘﻰ ﻛﻮﺩﺗ ـﺎ ‪ Repeat‬ﻧﯩ ـﯔ ﻧﻪﺗﯩﺠﯩ ـﺴﻰ ﺗﯩﺰﻣﯩﻼﺭﻧﯩ ـﯔ ﺗ ـﻮﭘﻠﯩﻤﻰ. ﺷ ـﯘﯕﺎ ﺋﯘﻧﯩ ـﯔ ﺋﯜﺳ ـﺘﯩﺪﻩ ﻳﻪﻧﻪ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫‪ SelectMany‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩـــﺴﯩﻨﻰ ﻗﻮﻟﻠﯩﻨﯩـــﭗ ﺑـــﺎﺭﻟﯩﻖ ﺋﻪﺯﺍﻻﺭﻧـــﻰ ﺑﯩـــﺮ ﺗﯩﺰﻣﯩﻐـــﺎ ﺗﻪﻛـــﺸﻰ ﺭﻩﺗـــﻠﻪﭖ‬ ‫ﺋﻮﺭﯗﻧﻼﺷﺘﯘﺭﺩﯗﻕ.‬ ‫ﺋﯩﺠﺮﺍ ﻧﻪﺗﯩﺠﯩﺴﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ:‬ ‫‪Paolo‬‬ ‫‪Marco‬‬ ‫‪James‬‬ ‫‪Frank‬‬ ‫‪Paolo‬‬ ‫‪Marco‬‬ ‫‪James‬‬ ‫‪Frank‬‬ ‫‪Paolo‬‬ ‫‪Marco‬‬ ‫‪James‬‬ ‫‪Frank‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫96‬ ‫‪) Empty‬ﻗﯘﺭﯗﻕ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ(‬ ‫ﻣﻪﺯﻛﯘﺭ ﻣﻪﺷﻐﯘﻻﺗﭽﻰ ﻣﻪﻟﯘﻡ ﺗﯩﭙﻠﯩﻖ ﺋﻪﺯﺍﻧﯩﯔ ﻗﯘﺭﯗﻕ ﺗﯩﺰﻣﯩﺴﯩﻨﻰ ﻗـﺎﻳﺘﯘﺭﯗﭖ ﺑﯧﺮﻩﻟﻪﻳـﺪﯗ. ﻳﻪﻧـﻰ ﻗـﯘﺭﯗﻕ‬ ‫ﺗﯩﺰﻣﺎ ﮬﺎﺳﯩﻞ ﻗﯩﻠﯩﺸﺘﺎ ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺪﯗ. ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫ﻛﻮﺩ 34.4 ‪ Empty‬ﺩﯨﻦ ﭘﺎﻳﺪﯨﻠﯩﻨﯩﭗ ﺧﯧﺮﯨﺪﺍﺭ ﺗﯩﭙﯩﻨﯩﯔ ﻗﯘﺭﯗﻕ ﺗﯩﺰﻣﯩﺴﯩﻨﻰ ﮬﺎﺳﯩﻞ ﻗﯩﻠﯩﺶ‬ ‫ ;)(>‪IEnumerable customers = Enumerable.Empty‪public static bool Any source‬‬ ‫ ;)‪    Func predicate‬‬ ‫ (>‪public static bool Any source‬‬ ‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﻣﯧﺘﻮﺩ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﯨﻨﻰ ﻛـﯚﺭﮔﯩﻨﯩﯖﯩﺰﺩﻩ، ﻛﺎﻟﻠﯩﯖﯩﺰﻏـﺎ »ﻣﻪﻧـﺒﻪﺩﯨﻦ ﺑﺎﺷـﻘﺎ ﮬﯧﭽﻘﺎﻧـﺪﺍﻕ ﺷـﻪﺭﺕ‬ ‫ﻗﻮﺑﯘﻝ ﻗﯩﻠﻤﺎﻳﺪﯨﻐﺎﻥ ﻣﯧﺘﻮﺩ ﺷﻪﻛﻠﻰ ﻧـﯧﻤﯩﮕﻪ ﺋﺎﺳـﺎﻥ ﺭﺍﺳـﺖ- ﻳﺎﻟﻐـﺎﻥ ﻗﯩﻤـﻤﻪﺕ ﻗﺎﻳﺘﯘﺭﯨـﺪﯗ؟« ﺩﯦـﮕﻪﻥ‬ ‫ﺳﯘﺋﺎﻝ ﻛﯧﻠﯩـﺸﻰ ﻣـﯘﻣﻜﯩﻦ. ﻣﻪﺯﻛـﯘﺭ ﺋﻪﻧﺪﯨﺰﯨـﺪﻩ، ﺋﻪﮔﻪﺭ ﻣﻪﻧـﺒﻪ ﺗﯩﺰﻣﯩـﺪﺍ ﻛﻪﻡ ﺩﯦﮕﻪﻧـﺪﻩ ﺑﯩـﺮ ﺩﺍﻧﻪ ﺋﻪﺯﺍ‬ ‫ﺑﻮﻟـﺴﺎ ﺭﺍﺳـﺘﻨﻰ، ﺋﯘﻧـﺪﺍﻕ ﺑﻮﻟﻤﯩـﺴﺎ ﻳﺎﻟﻐـﺎﻧﻨﻰ ﻗﺎﻳﺘﯘﺭﯨـﺪﯗ. ﮬﯧـﺴﺎﺑﺘﺎ، ﻣﻪﻟـﯘﻡ ﺗﯩﺰﻣﯩﻨﯩـﯔ ﻗـﯘﺭﯗﻕ ﻳـﺎﻛﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﻪﻣﻪﺳﻠﯩﻜﯩﻨﻰ ﺗﻪﻛﺸﯜﺭﯨﺪﯗ.‬ ‫ﺋﯩﻜﻜﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﺪﻩ ﺑﻮﻟﺴﺎ، ﻛﯚﺭﺳﻪﺗﻤﻪ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺷﻪﺭﺕ ﻳﻮﻟﻠﯩﻨﯩﺪﯗ، ﺋﻪﮔﻪﺭ ﺗﯩﺰﻣﯩﺪﺍ ﺋﯘﺷﺒﯘ ﺷﻪﺭﺗﻨﻰ‬ ‫ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﺪﯛﺭﯨﺪﯨﻐﺎﻥ ﺋﻪﺯﺍﺩﯨﻦ ﻛﯧﻤﯩﺪﻩ ﺑﯩﺮﺳﻰ ﺑﻮﻟﺴﺎ ﺭﺍﺳﺘﻨﻰ، ﺑﻮﻟﻤﯩﺴﺎ ﻳﺎﻟﻐﺎﻧﻨﻰ ﻛﻪﻟﺘﯜﺭﯨﺪﯗ.‬ ‫ﻣﻪﺳـﯩﻠﻪﻥ: ﺗﯚﯞﻩﻧـﺪﯨﻜﻰ ﻣﯩـﺴﺎﻟﺪﺍ ﺑـﺎﺭﻟﯩﻖ ﺧﯧﺮﯨـﺪﺍﺭﻻﺭﻧﯩﯔ ﺑـﺎﺭﻟﯩﻖ ﺯﺍﻛﺎﺯﻟﯩﺮﯨﻨﯩـﯔ ﺋﯩﭽﯩـﺪﻩ ﻣﻪﮬـﺴﯘﻻﺕ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺗﻪﺭﺗﯩــﭗ ﻧﻮﻣــﯘﺭﻯ )‪ 1 (idProduct‬ﮔﻪ ﺗﻪﯓ ﺑﻮﻟﻐــﺎﻥ ﻣﻪﮬــﺴﯘﻻﺗﻨﯩﯔ ﻣﻪﯞﺟــﯘﺕ ﻳــﺎﻛﻰ ﺋﻪﻣﻪﺳــﻠﯩﻜﻰ‬ ‫ﺗﻪﻛﺸﯜﺭﯛﻟﯩﺪﯗ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫07‬ ‫ﻛﻮﺩ 44.4‬ ‫ = ‪bool result‬‬ ‫ ‪    (from c in customers‬‬ ‫ ‪         from   o in c.Orders‬‬ ‫ )‪         select o‬‬ ‫ ;)1 == ‪    .Any(o => o.IdProduct‬‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻗﯘﺭﺩﺍ ﻧﻪﺗﯩﺠﯩﻨﻰ ﻗﻪﺳﺘﻪﻥ ﻳﺎﻟﻐﺎﻥ ﭼﯩﻘﺎﺭﺩﯗﻕ، ﭼﯜﻧﻜﻰ ﺗﯩﺰﻣﺎ ﻗﯘﺭﯗﻕ//‬ ‫‪result  Enumerable.Empty().Any(o  o.IdProduct  1);//false‬‬ ‫ =‬ ‫ >=‬ ‫ ==‬ ‫ﺷﯘﻧﯩﺴﻰ ﺋﯧﺴﯩﯖﯩﺰﺩﻩ ﺑﻮﻟـﺴﯘﻥ، ﺗﻪﻛـﺸﯜﺭﯛﺵ ﺟﻪﺭﻳﺎﻧﯩـﺪﺍ 1 == ‪ o.IdProduct‬ﻗﺎﻧـﺎﺋﻪﺗﻠﻪﻧﮕﻪﻥ ﺯﺍﻣـﺎﻧﻼ‬ ‫ﺋﻮﻣﯘﻣﯩﻲ ﺋﯩﭙﺎﺩﻩ ﺋﺎﺧﯩﺮﻟﯩﺸﯩﺪﯗ.‬ ‫‪) All‬ﮬﻪﻣﻤﻪ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ(‬ ‫‪ All‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﺑﺎﺭﻟﯩﻖ ﺋﻪﺯﺍﻻﺭﻧﯩﯔ ﺑﯧـﺮﯨﻠﮕﻪﻥ ﺷـﻪﺭﺗﻨﻰ ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﺪﯛﺭﯨـﺪﯨﻐﺎﻥ ﻳـﺎﻛﻰ‬ ‫ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﺪﯛﺭﻣﻪﻳﺪﯨﻐﺎﻧﻠﯩﻘﯩﻨﻰ ﺗﻪﻛﺸﯜﺭﯛﺷﻜﻪ ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺪﯗ. ﺋﻪﮔﻪﺭ ﮬﻪﻣﻤﯩﺴﻰ ﺷﻪﺭﺗﻨﻰ ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﺪﯛﺭﺳﻪ‬ ‫ﺭﺍﺳﺘﻨﻰ، ﺋﯘﻧﺪﺍﻕ ﺑﻮﻟﻤﯩﺴﺎ ﻳﺎﻟﻐﺎﻧﻨﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ.‬ ‫ﻣﻪﺳﯩﻠﻪﻥ: ﮬﻪﺭﺑﯩﺮ ﺯﺍﻛﺎﺯ ﻣﯩﻘﺪﺍﺭﯨﻨﯩﯔ ﻣﯘﺳﺒﻪﺕ ﺳـﺎﻥ ﺑﻮﻟـﯘﺵ ﺷـﻪﺭﺗﯩﻨﻰ ﻗﺎﻧﻪﺋﻪﺗﻠﻪﻧﺪﯛﺭﯨـﺪﯨﻐﺎﻥ ﻳـﺎﻛﻰ‬ ‫ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﺪﯛﺭﻣﻪﻳﺪﯨﻐﺎﻧﻠﯩﻘﯩﻨﻰ ﺗﻪﻛﺸﯜﺭﯛﭖ ﺑﺎﻗﺎﻳﻠﻰ:‬ ‫ﻛﻮﺩ 54.4‬ ‫ = ‪bool result‬‬ ‫ ‪    (from c in customers‬‬ ‫ ‪         from o in c.Orders‬‬ ‫ )‪         select o‬‬ ‫ ;)0 > ‪    .All(o => o.Quantity‬‬ ‫ ‬ ‫ ;)0 > ‪result = Enumerable.Empty().All(o => o.Quantity‬‬ ‫‪//false‬‬ ‫ﺋﻪﺳـﻜﻪﺭﺗﯩﺶ: ﺋﻪﮔﻪﺭ ‪ All‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩـﺴﻰ ﻗـﯘﺭﯗﻕ ﺗﯩﺰﻣﯩﻐـﺎ ﺋﯩﺸﻠﯩﺘﯩﻠـﺴﻪ ﻧﻪﺗﯩﺠﯩـﺴﻰ ﺑﯩـﺮﺩﻩﻙ ﺭﺍﺳـﺖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﻮﻟﯩﺪﯗ.‬ ‫‪) Contains‬ﺑﺎﺭﻣﯘ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ(‬ ‫ﺑﯧ ـﺮﯨﻠﮕﻪﻥ ﺋﻪﺯﺍﻧﯩ ـﯔ ﻣﻪﻧ ـﺒﻪ ﺗﯩﺰﻣﯩ ـﺪﺍ ﺑ ـﺎﺭ- ﻳ ـﻮﻗﻠﯩﻘﯩﻨﻰ ﺗﻪﻛ ـﺸﯜﺭﯨﺪﯗ. ﺑ ـﺎﺭ ﺑﻮﻟ ـﺴﺎ ﺭﺍﺳ ـﺘﻨﻰ، ﺑﻮﻟﻤﯩ ـﺴﺎ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻳﺎﻟﻐﺎﻧﻨﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ. ﺋﯘﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ:‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫17‬ ‫ (>‪public static bool Contains source‬‬ ‫ ;)‪    T value‬‬ ‫ (>‪public static bool Contains source‬‬ ‫ ,‪    T value‬‬ ‫)‪    IEqualityComparer comparer‬‬ ‫ﺋﻪﮔﻪﺭ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭ >‪ ICollection‪ EqualityComparer‪public static IEnumerable Take source‬‬ ‫;)‪    int count‬‬ ‫ﺩﯦﻤﻪﻙ ‪ Take‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﻣﻪﻧـﺒﻪ ﺗﯩﺰﻣﯩـﺪﯨﻜﻰ ﺋﺎﻟـﺪﯨﻨﻘﻰ ‪ count‬ﺩﺍﻧﻪ ﺋﻪﺯﺍﻧـﻰ ﻗـﺎﻳﺘﯘﺭﯗﭖ ﺑﯧﺮﯨـﺪﯗ.‬ ‫ﺋﻪﮔﻪﺭ ﻛﯚﺯﻟﯩﻤﻪ ﻣﯩﻘﺪﺍﺭ ﻧﯚﻝ ﺑﻮﻟﺴﺎ ﻗﯘﺭﯗﻕ ﺗﯩﺰﻣﯩﻨﻰ، ﻣﻪﻧـﺒﻪ ﺗﯩﺰﻣـﺎ ﺋﯘﺯﯗﻧﻠﯘﻗﯩـﺪﯨﻦ ﭼـﻮﯓ ﺑﻮﻟـﺴﺎ ﻣﻪﻧـﺒﻪ‬ ‫ﺗﯩﺰﻣﯩﻨﯩﯔ ﺋﯚﺯﯨﻨﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ. ﺑـﯘ ﻣﻪﺷـﻐﯘﻻﺗﭽﻰ »ﺧﯧﺮﯨـﺪﺍﺭﻻﺭ ﺋﺎﺭﯨـﺴﯩﺪﯨﻦ ﺯﺍﻛـﺎﺯ ﭘـﯘﻝ ﻣﯩﻘـﺪﺍﺭﻯ ﺋﻪﯓ‬ ‫ﭼﻮﯓ ﺑﻮﻟﻐـﺎﻥ ﺋﺎﻟـﺪﯨﻨﻘﻰ 2 ﺧﯧﺮﯨـﺪﺍﺭﻧﻰ ﺗـﺎﻟﻼﺵ« ﺩﯦﮕﻪﻧـﺪﻩﻙ ﻣﻪﺳـﯩﻠﯩﻠﻪﺭﮔﻪ ﺗﻮﻟﯩﻤـﯘ ﻣـﺎﺱ ﻛﯧﻠﯩـﺪﯗ.‬ ‫ﻣﻪﺳﯩﻠﻪﻥ:‬ ‫ﻛﻮﺩ 74.4‬ ‫ = ‪var topTwoCustomers‬‬ ‫ ‪    (from    c in customers‬‬ ‫ ( ‪     join    o in‬‬ ‫ ‪             from c in customers‬‬ ‫ ‪                 from   o in c.Orders‬‬ ‫ ‪                 join   p in products‬‬ ‫ ‪                        on o.IdProduct equals p.IdProduct‬‬ ‫ * ‪                 select new { c.Name, OrderAmount = o.Quantity‬‬ ‫ } ‪p.Price‬‬ ‫ ‪             ) on c.Name equals o.Name‬‬ ‫ ‪             into customersWithOrders‬‬ ‫ >= ‪     let     TotalAmount = customersWithOrders.Sum(o‬‬ ‫ )‪o.OrderAmount‬‬ ‫ ‪     orderby TotalAmount descending‬‬ ‫ } ‪     select  new { c.Name, TotalAmount‬‬ ‫ ;)2(‪    ).Take‬‬ ‫ﻛﯚﺭﮔﻪﻧﺴﯩﺰ! ﮔﻪﺭﭼﻪ ﺋﻮﻣﯘﻣﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ﺋﯩﻨﺘﺎﻳﯩﻦ ﭼﯩﺮﻣﺎﺵ ﺑﻮﻟﻐﺎﻥ ﺑﯩﻠﻪﻥ، ‪ Take‬ﻧﻰ‬ ‫ﺋﻮﺭﯗﻧﻼﺷﺘﯘﺭﯗﺵ ﻧﺎﮬﺎﻳﯩﺘﻰ ﺋﺎﺩﺩﯨﻲ. ﻳﯘﻗﯩﺮﯨﻘﻰ ﺋﯩﭙﺎﺩﯨﺪﻩ ﺑﯘﺭﯗﻥ ﺳﯚﺯﻟﯩﮕﻪﻥ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺧﺎﺱ‬ ‫ﺳﯚﺯﻟﯩﺮﯨﻨﻰ ﺋﯩﺸﻠﯩﺘﯩﺶ ﺑﯩﻠﻪﻥ ﺑﯩﺮ ﯞﺍﻗﯩﺘﺘﺎ ﻳﯧﯖﻰ ﺧﺎﺱ ﺳﯚﺯ ‪ let‬ﻣﯘ ﺋﯩﺸﻠﯩﺘﯩﻠﺪﻯ. ‪ let‬ﺧﺎﺱ ﺳﯚﺯﻯ ﺋﯩﭙﺎﺩﻩ‬ ‫ﺋﯩﭽﯩﺪﻩ ﻣﻪﻟﯘﻡ ﮬﻪﺭﭖ-ﺑﻪﻟﮕﻪ ﺗﯩﻤﯩﺴﯩﻨﻰ ﻣﻪﻟﯘﻡ ﻗﯩﻤﻤﻪﺗﻜﻪ ﻳﺎﻛﻰ ﻣﻪﻟﯘﻡ ﻓﻮﺭﻣﯩﻼ ﻗﯩﻤﻤﯩﺘﯩﮕﻪ ﺗﻪﯕﺪﺍﺵ ﻗﯩﻠﯩﺶ‬ ‫ﺭﻭﻟﯩﻨﻰ ﺋﻮﻳﻨﺎﻳﺪﯗ. ﺯﺍﻏﺮﺍ ﺗﯩﻞ ﺑﻮﻳﯩﭽﻪ ﺋﯩﭙﺎﺩﻩ ﺋﯩﭽﯩﺪﻩ ﻳﻪﺭﻟﯩﻚ ﺋﯚﺯﮔﻪﺭﮔﯜﭼﻰ ﻣﯩﻘﺪﺍﺭ ﺋﯧﻨﯩﻘﻼﻳﺪﯗ ﺩﯦﺴﻪﻛﻤﯘ‬ ‫(. ﻣﻪﺳﯩﻠﻪﻥ: ﻳﯘﻗﯩﺮﯨﻘﻰ ﻣﯩﺴﺎﻟﯩﻤﯩﺰﺩﺍ ﺯﺍﻛﺎﺯﻯ ﺑﺎﺭ ﺧﯧﺮﯨﺪﺍﺭﻧﯩﯔ‬ ‫ﺑﻮﻟﯩﺪﯗ)ﺑﯘ ﺯﺍﻏﺮﺍ ﺗﯩﻞ ﺋﻪﻣﻪﺳﻤﯘ ﻳﺎ...‬ ‫ﺑﺎﺭﻟﯩﻖ ﺯﺍﻛﺎﺯﻟﯩﺮﯨﻨﯩﯔ ﻗﯩﻤﻤﻪﺕ ﻳﯩﻐﯩﻨﺪﯨﺴﯩﻨﻰ ‪ TotalAmout‬ﺩﯦﮕﻪﻧﮕﻪ ﺳﺎﻗﻼﭖ ﺗﯘﺭﺩﯗﻕ.‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫37‬ ‫‪) TakeWhile‬ﭼﺎﻏﺪﺍ- ﺋﯧﻠﯩﺶ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ(‬ ‫ﺋﯩﺸﻠﯩﺘﯩﺶ ﺋﯘﺳﯘﻟﻰ ‪ Take‬ﺑﯩـﻠﻪﻥ ﺋﻮﺧﺸﯩـﺸﯩﭗ ﻛﯧﺘﯩـﺪﯨﻐﺎﻥ ﺑﻮﻟـﯘﭖ، ﺑﯘﻧﯩﯖـﺪﺍ ﺋﺎﻟـﺪﯨﻨﻘﻰ ﻣﺎﻧﭽﯩـﺴﯩﻨﻰ‬ ‫ﺋﻪﻣﻪﺱ، ﺑﻪﻟﻜﻰ ﺋﺎﻟﺪﯨﻨﻘﻰ ﺋﻪﺯﺍﻻﺭﻧﻰ ﺗـﺎﻛﻰ ﺷـﻪﺭﺕ ﻗﺎﻧـﺎﺋﻪﺗﻠﻪﻧﻤﯩﮕﯩﭽﻪ ﺋﺎﻟﯩـﺪﯗ. ﺗﯚﯞﻩﻧـﺪﯨﻜﯩﻠﻪﺭ ﺋﯘﻧﯩـﯔ‬ ‫ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ:‬ ‫ (>‪public static IEnumerable TakeWhile source‬‬ ‫ ;)‪    Func predicate‬‬ ‫ (>‪public static IEnumerable TakeWhile source‬‬ ‫;)‪    Func predicate‬‬ ‫ﺑﯩﺮﯨﻨﭽﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﺪﻩ، ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﻨﯩﯔ ﻧﯚﻟﯩﻨﭽﻰ ﺋﻪﺯﺍﺳﯩﺪﯨﻦ ﺑﺎﺷﻼﭖ ﭼﺎﺭﻻﺵ ﺋﯧﻠﯩـﭗ ﺋﯘﻧﯩـﯔ‬ ‫ﻛﯚﺭﺳــــﻪﺗﻜﯜﭼﺘﯩﻜﻰ ﺷــــﻪﺭﺗﻜﻪ ﭼﯜﺷــــﯩﺪﯨﻐﺎﻥ ﻳــــﺎﻛﻰ ﭼﯜﺷــــﻤﻪﻳﺪﯨﻐﺎﻧﻠﯩﻘﯩﻨﻰ ﺗﻪﻛــــﺸﯜﺭﯨﺪﯗ، ﺋﻪﮔﻪﺭ‬ ‫ﭼﯜﺷﺴﻪ)ﻛﯚﺭﺳﻪﺗﻤﻪ ﻗﯩﻤﻤﯩﺘﻰ ﺭﺍﺳﺖ ﺑﻮﻟـﺴﺎ( ﺋـﯘﻧﻰ ﺋـﯘ ﻧﻪﺗﯩـﺠﻪ ﺗﻮﭘﻠﯩﻤﯩﻐـﺎ ﻗﻮﺷـﯘﭖ ﺑﻮﻟـﯘﭖ ﻛﯧﻴﯩﻨﻜـﻰ‬ ‫ﺋﻪﺯﺍﻧﻰ ﺋﻮﺧﺸﺎﺵ ﺋﯘﺳﯘﻟﺪﺍ ﺗﻪﻛﺸﯜﺭﯨﺪﯗ. ﺑﯘ ﺟﻪﺭﻳـﺎﻥ ﺗـﺎﻛﻰ ﻣﻪﻟـﯘﻡ ﺋﻪﺯﺍ ﺷـﻪﺭﺗﻜﻪ ﭼﯜﺷـﻤﯩﮕﻪﻧﮕﻪ ﻳـﺎﻛﻰ‬ ‫ﺋﻪﯓ ﺋﺎﺧﯩﺮﯨﻘﻰ ﺋﻪﺯﺍﻧﻰ ﺗﻪﻛﺸﯜﺭﯛﺵ ﺗﺎﻣﺎﻣﻼﻧﻐﺎﻧﻐﺎ ﻗﻪﺩﻩﺭ ﺩﺍﯞﺍﻣﻠﯩﺸﯩﺪﯗ.‬ ‫ﺋﯩﻜﻜﯩﻨﭽﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﺪﻩ ﭘﺎﺭﺍﻣﯧﺘﯩﺮ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺑﯩﺮ ﺩﺍﻧﻪ ﭘﯜﺗـﯜﻥ ﺳـﺎﻥ ﻳـﻮﻟﻼﭖ ﺑﯧﺮﯨﻤﯩـﺰ، ﭼـﺎﺭﻻﺵ‬ ‫ﻣﻪﺷﻐﯘﻻﺗﻰ ﺋﯘﺷﺒﯘ ﺳﺎﻥ ﺗﻪﺭﺗﯩﭙﻠﯩﻚ ﺋﻪﺯﺍﺩﯨﻦ ﺑﺎﺷﻠﯩﻨﯩﺪﯗ.‬ ‫ﺋﯘﻧﯩﯖﺪﯨﻦ ﺑﺎﺷﻘﺎ ﺷﻪﺭﺕ ﻛﯚﺭﺳﻪﺗﻤﯩﺴﯩﻨﻰ ﻣﯘﯞﺍﭘﯩﻖ ﺗﯜﺯﯛﺵ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺗﯧﺨﯩﻤﯘ ﻣـﯘﺭﻩﻛﻜﻪﭖ ﻣﻪﺳـﯩﻠﯩﻠﻪﺭﻧﻰ‬ ‫ﮬﻪﻝ ﻗﯩﻼﻻﻳﻤﯩﺰ. ﻣﻪﺳﯩﻠﻪﻥ: ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻣﯩﺴﺎﻟﺪﺍ ﺯﺍﻛﺎﺯ ﻣﯩﻘـﺪﺍﺭﻯ ﻗﯩﻤﻤﯩﺘـﻰ ﺋﻮﻣـﯘﻣﻰ ﻗﯩﻤﻤﻪﺗﻨﯩـﯔ 08%‬ ‫ﺗﯩﻨﻰ ﺋﯩﮕﯩﻠﻪﻳﺪﯨﻐﺎﻥ ﺋﺎﻟﺪﯨﻨﻘﻰ ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻏﺎ ﺋﯧﺮﯨﺸﯩﺪﯗ:‬ ‫ﻛﻮﺩ 84.4‬ ‫//‬ ‫ ;‪var limitAmount = globalAmount * 0.8m‬‬ ‫ ;‪var aggregated = 0m‬‬ ‫ = ‪var topCustomers‬‬ ‫ ‪    (from    c in customers‬‬ ‫ ( ‪     join    o in‬‬ ‫ ‪             from c in customers‬‬ ‫ ‪                 from   o in c.Orders‬‬ ‫ ‪                 join   p in products‬‬ ‫ ‪                        on o.IdProduct equals p.IdProduct‬‬ ‫ * ‪                 select new { c.Name, OrderAmount = o.Quantity‬‬ ‫ } ‪p.Price‬‬ ‫ ‪             ) on c.Name equals o.Name‬‬ ‫ ‪             into customersWithOrders‬‬ www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 74      let     TotalAmount = customersWithOrders.Sum(o =>  o.OrderAmount)       orderby TotalAmount descending       select  new { c.Name, TotalAmount }      )      .TakeWhile( X => {                      bool result = aggregated < limitAmount;                      aggregated += X.TotalAmount;                      return result;                  } );  SkipWhile ‫ ﺑﯩﻠﻪﻥ‬Skip ‫ ﻟﻪﺭﻧﯩﯖﻜﯩــﮕﻪ ﺋﯩﻨﺘــﺎﻳﯩﻦ‬TakeWhile ‫ ﺑﯩــﻠﻪﻥ‬Take ‫ ﻧﯩــﯔ ﺋﻪﻧــﺪﯨﺰﯨﻠﯩﺮﻯ‬SkipWhile ‫ ﺑﯩــﻠﻪﻥ‬Skip :‫ﺋﻮﺧﺸﯩﺸﯩﭗ ﻛﯧﺘﯩﺪﯗ. ﻳﻪﻧﻰ‬ public static IEnumerable Skip(      this IEnumerable source,      int count);  public static IEnumerable SkipWhile(      this IEnumerable source,      Func predicate);  public static IEnumerable SkipWhile(      this IEnumerable source,      Func predicate); .‫ ﻧﯩﯔ ﺗﻮﻟﯘﻗﻠﯩﻐـﯘﭼﯩﻠﺮﻯ ﺩﻩﭖ ﺋﯧﻴﺘﻘﺎﻧﯩـﺪﯗﻕ‬TakeWhile ‫ ﺑﯩﻠﻪﻥ‬Take ‫ﺑﺎﻳﺎﻡ ﺗﯧﺨﻰ ﺑﯘ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻼﺭ‬ :‫ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ، ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻛﻮﺩ ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﯩﯔ ﺗﻮﻟﯘﻕ ﺗﯩﺰﻣﯩﺴﯩﻨﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ‬ var result = customers.Take(3).Union(customers.Skip(3));  var result =  customers.TakeWhile(p).Union(customers.SkipWhile(p));  ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫57‬ ‫ﺋﯧﻠﯧﻤﯧﻨﺖ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ‬ ‫ﺋﯧﻠﯧﻤﯧﻨــﺖ ﻣﻪﺷــﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺗﯩﺰﻣــﺎ ﺋﯩﭽﯩــﺪﯨﻜﻰ ﻣﻪﻟــﯘﻡ ﺑﯩــﺮﻻ ﺋﻪﺯﺍﻏــﺎ ﺋﺎﻻﻗﯩــﺪﺍﺭ ﻣﻪﺷــﻐﯘﻻﺗﻨﻰ ﺋﯧﻠﯩــﭗ‬ ‫ﺑﺎﺭﯨــﺪﯨﻐﺎﻥ ﺑﻮﻟــﯘﭖ، ﻣﻪﻟــﯘﻡ ﺋﻮﺭﯗﻧــﺪﯨﻜﻰ ﻳــﺎﻛﻰ ﺷــﻪﺭﺗﻜﻪ ﺋﯘﻳﻐــﯘﻥ ﺑﯩــﺮﻻ ﺋﻪﺯﺍﻧــﻰ ﻗﺎﻳﺘﯘﺭﯨــﺪﯗ. ﺋﻪﮔﻪﺭ‬ ‫ﺗﺎﭘﺎﻟﻤﯩﺴﺎ ﻛﯚﯕﯜﻟﺪﯨﻜﻰ ﻗﯩﻤﻤﻪﺕ ﺋﻪﺯﺍﺳﯩﻨﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ.‬ ‫‪) First‬ﺗﯘﻧﺠﻰ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ(‬ ‫‪ First‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩــﺴﻰ ﺗﯩﺰﻣﯩــﺪﯨﻜﻰ ﺗــﯘﻧﺠﻰ ﻳــﺎﻛﻰ )ﺋﻪﮔﻪﺭ ﻛﯚﺭﺳــﻪﺗﻤﻪ ﺷــﻪﺭﺗﻰ ﺑﯧﺮﯨﻠــﺴﻪ( ﺷــﻪﺭﺗﻨﻰ‬ ‫ﻗﺎﻧﻪﺋﻪﺗﻠﻪﻧﺪﯛﺭﯨﺪﯨﻐﺎﻥ ﯞﻩ ﻳﺎﻛﻰ ﺋﻮﺭﯗﻥ ﻗﺎﺋﯩﺪﯨﺴﯩﮕﻪ ﭼﯜﺷﯩﺪﯨﻐﺎﻥ ﺗﯘﻧﺠﻰ ﺋﻪﺯﺍﻧﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ:‬ ‫ (>‪public static T First source‬‬ ‫ (>‪public static T First source‬‬ ‫ ;)‪    Func predicate‬‬ ‫ﺑﯩﺮﯨﻨﭽﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﺪﻩ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﻨﯩﯔ ﺑﯩﺮﯨﻨﭽﻰ ﺋﯧﻠﯧﻤﯧﻨﺘﯩﻨﻰ ﻗﺎﻳﺘﯘﺭﯨـﺪﯗ. ﺋﯩﻜﻜﯩﻨﭽـﻰ ﺧﯩﻠﯩـﺪﺍ‬ ‫ﺑﯧــﺮﯨﻠﮕﻪﻥ ﺷــﻪﺭﺗﻜﻪ ﭼﯜﺷــﯩﺪﯨﻐﺎﻥ ﺗــﯘﻧﺠﻰ ﺋﯧﻠﯧﻤﯧﻨﺘﻨــﻰ ﻗﺎﻳﺘﯘﺭﯨــﺪﯗ. ﺋﻪﮔﻪﺭ ﺷــﻪﺭﺗﻜﻪ ﭼﯜﺷــﯩﺪﯨﻐﺎﻥ‬ ‫ﺋﯧﻠﯧﻤﯧﻨﺖ ﺗﯧﭙﯩﻠﻤﯩﺴﺎ ﻳﺎﻛﻰ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﺎ ﻗـﯘﺭﯗﻕ ﺑﻮﻟـﺴﺎ، ﻣﻪﺷـﻐﯘﻻﺗﭽﻰ ‪InvalidOperationException‬‬ ‫ﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﻗﻮﻳﯘﭖ ﺑﯧﺮﯨﺪﯗ. ﺗﯚﯞﻩﻧﺪﻩ ﺑﯩﺮ ﻣﯩﺴﺎﻝ:‬ ‫ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻜﻰ ‪ USA‬ﺑﻮﻟﻐﺎﻥ ﺗﯘﻧﺠﻰ ﺧﯧﺮﯨﺪﺍﺭﻏﺎ ﺋﯧﺮﯨﺸﯩﺶ‬ ‫ﻛﻮﺩ 94.4‬ ‫ ;)‪var item = customers.First(c => c.Country == Countries.USA‬‬ ‫ﺋﻪﻟﯟﻩﺗﺘﻪ ﻳﯘﻗﯩﺮﯨﻘﻰ ﻣﻪﻗﺴﻪﺗﻨﻰ ﺗﯚﯞﻩﻧﻜﻰ ﺋﯘﺳﯘﻝ ﺋﺎﺭﻗﯩﻠﯩﻘﻤﯘ ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﺍﻻﻳﻤﯩﺰ:‬ ‫ ‪var‬‬ ‫;)1(‪item  customers.Where(c  c.Country  Countries.USA).Take‬‬ ‫ =‬ ‫ >=‬ ‫ ==‬ ‫ﺑﯩﺮﺍﻕ ‪ First‬ﺋﯩﭙﺎﺩﻩ ﻣﻪﻗﺴﯩﺘﯩﻨﻰ ﺗﯧﺨﯩﻤﯘ ﺋﯧﻨﯩﻖ ﺋﯩﭙﺎﺩﯨﻠﻴﻪﻟﻪﻳﺪﯗ.‬ ‫‪FirstOrDefault‬‬ ‫‪ FirstOrDefault‬ﻧﻰ »ﺗﯘﻧﺠﯩﺴﻰ ﺑﻮﻟﻤﯩﺴﺎ ﻛﯚﯕﯜﻟﺪﯨﻜﯩﻨﻰ« ﺩﻩﭖ ﺗﻪﺭﺟﯩﻤﻪ ﻗﯩﻠﺴﺎﻡ ﻣﯘﯞﺍﭘﯩﻖ ﺩﻩﭖ‬ ‫ﺋﻮﻳﻠﯩﺪﯨﻢ. ﺋﯘﻧﯩﯔ ﻣﻪﺷﻐﯘﻻﺕ ﭘﯩﺮﯨﻨﺴﯩﭙﻰ `‪ First‬ﺑﯩﻠﻪﻥ ﺋﻮﺧﺸﺎﺵ ﺑﻮﻟﯘﭖ، ﺑﯩﺮﺩﯨﻦ- ﺑﯩﺮ ﭘﻪﺭﻗﻰ. ﺋﻪﮔﻪﺭ‬ ‫ﺷﻪﺭﺗﻜﻪ ﺋﯘﻳﻐﯘﻥ ﮬﯧﭽﻘﺎﻧﺪﺍﻕ ﺋﯧﻠﻤﯧﻨﺖ ﺗﯧﭙﯩﻠﻤﯩﺴﺎ ﻣﻪﻧﺒﻪ ﺋﻪﺯﺍﻟﯩﺮﯨﻨﻰ ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺗﯩﭙﻠﯩﻖ ‪ null‬ﻧﻰ،‬ ‫ﻗﯩﻤﻤﻪﺗﻠﯩﻚ ﺗﯩﭙﻠﯩﻖ ﺑﻮﻟﺴﺎ ﺷﯘ ﺗﯩﭙﻨﯩﯔ ‪ nullable‬ﺋﯩﻨﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ. ﺗﯚﯞﻩﻧﺪﻩ ﺑﯩﺮ ﻣﯩﺴﺎﻝ:‬ www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 76 4.50 ‫ﻛﻮﺩ‬ var item = customers.FirstOrDefault(c => c.City == "Las Vegas");  Console.WriteLine(item  null  "null"  item.ToString());  null  ==  ?  :  //    IEnumerable emptyCustomers =  Enumerable.Empty();  item = emptyCustomers.FirstOrDefault(c => c.City == "Las Vegas");  Console.WriteLine(item  null  "null"  item.ToString());  null ==  ?  :  //  LastOrDefault ‫ ﺑﯩﻠﻪﻥ‬Last ‫ ﻻﺭﻏﺎ ﺋﻮﺧﺸﯩﺸﯩﭗ ﻛﯧﺘﯩﺪﯨﻐﺎﻥ‬FirstOrDefault ‫ ﺑﯩﻠﻪﻥ‬First ‫ ﻻﺭ ﺑﻮﻟﺴﺎ‬LastOrDefault ‫ ﺑﯩﻠﻪﻥ‬Last ‫ ﺗﯘﻧﺠﯩﺴﯩﻨﻰ ﺋﺎﻟﺴﺎ، ﺑﯘﻻﺭ ﺋﻪﯓ ﺋﺎﺧﯩﺮﯨـﺪﯨﻜﯩﻨﻰ ﺋﺎﻟﯩـﺪﯗ. ﺑﺎﺷـﻘﺎ‬FirstOrDefault ‫ ﺑﯩﻠﻪﻥ‬First ،‫ﺑﻮﻟﯘﭖ‬ :‫ﺑﺎﺭﻟﯩﻖ ﻗﯘﺭﯗﻟﻤﯩﻠﯩﺮﻯ ﺋﻮﭘﻤﯘ- ﺋﻮﺧﺸﺎﺵ. ﺗﯚﯞﻩﻧﺪﯨﻜﯩﻠﯩﺮﻯ ﺋﯘﻻﺭﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ‬ public static T Last(      this IEnumerable source);  public static T Last(      this IEnumerable source,      Func predicate);  public static T LastOrDefault(      this IEnumerable source);  public static T LastOrDefault(      this IEnumerable source,      Func predicate); Single ‫ﺋﻪﮔﻪﺭ ﺗﯩﺰﻣﯩﺪﯨﻦ ﺑﯩﺮ ﺗﺎﻝ ﺋﻪﺯﺍﻧﻰ ﺷﯘﻧﺪﺍﻗﻼ )ﻣﻪﺳﯩﻠﻪﻥ: ﺗﯩﺰﻣﯩﻼﺭﻧﯩـﯔ ﯞﻩﻛﯩﻠـﻰ ﺳـﯜﭘﯩﺘﯩﺪﻩ( ﺋﺎﻟﻤـﺎﻗﭽﻰ‬ :‫ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﻰ ﺋﯩﺸﻠﯩﺘﯩﯔ. ﺋﯘﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ‬Single ‫ﺑﻮﻟﺴﯩﯖﯩﺰ‬ public static T Single(      this IEnumerable source);  public static T Single(      this IEnumerable source,      Func predicate); ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫77‬ ‫ﺋﻪﮔﻪﺭ ﻛﯚﺭﺳﻪﺗﻜﯜﭺ ﺷﻪﺭﺗﻰ ﺑﯧﺮﯨﻠﻤﯩﺴﻪ، ﻗﺎﻳﺘﯩﺪﯨﻐﯩﻨﻰ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﺑﯩﺮﯨﻨﭽﻰ ﺋﯧﻠﯧﻤﯧﻨﺖ ﺑﻮﻟﯩﺪﯗ. ﺋﯘﻧﺪﺍﻕ‬ ‫ﺑﻮﻟﻤﯩﻐﺎﻧﺪﺍ ﺷﻪﺭﺗﻜﻪ ﭼﯜﺷﯩﺪﯨﻐﺎﻥ ﺑﯩﺮ ﺗﺎﻝ ﺋﯧﻠﯧﻤﯧﻨﺖ ﺑﻮﻟﯩﺪﯗ. ﺋﻪﮔﻪﺭ ﻛﯚﺭﺳﻪﺗﻜﯜﭺ ﺑﻮﻟﻤﯩﺴﺎ ﮬﻪﻣﺪﻩ ﺗﯩﺰﻣﯩﺪﺍ‬ ‫ﺑﯩﺮﺩﯨﻦ ﺋﺎﺭﺗﯘﻕ ﺋﯧﻠﯧﻤﻨﺖ ﺑﻮﻟﺴﺎ ‪ InvalidOperationException‬ﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﻗﻮﻳﯘﭖ ﺑﯧﺮﯨﻠﯩﺪﯗ.‬ ‫ﺋﻪﮔﻪﺭ ﻛﯚﺭﺳﻪﺗﻜﯜﭺ ﺑﯧﺮﯨﻠﺴﻪ ﻟﯧﻜﯩﻦ ﺗﯩﺰﻣﯩﺪﺍ ﺷﻪﺭﺗﻜﻪ ﭼﯜﺷﯩﺪﯨﻐﺎﻥ ﺑﯩﺮﻣﯘ ﺋﯧﻠﯧﻤﯧﻨﺖ ﺑﻮﻟﻤﯩﺴﺎ ﻳﺎﻛﻰ ﺗﯩﺰﻣﺎ‬ ‫ﻗﯘﺭﯗﻕ ﺑﻮﻟﺴﺎ ‪ InvalidOperationException‬ﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﭼﯩﻘﯩﺮﯨﺪﯗ. ﺗﯚﯞﻩﻧﺪﯨﻜﯩﻠﻪﺭ‬ ‫ﺋﻮﺧﺸﯩﻤﯩﻐﺎﻥ ﺋﻪﮬﯟﺍﻟﻼﺭﻏﺎ ﻣﺎﺱ ﻣﯩﺴﺎﻟﻼﺭ:‬ ‫ﻛﻮﺩ 15.4‬ ‫1 ‪ Product‬ﻧﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ //‬ ‫ ;)1 == ‪var item = products.Single(p => p.IdProduct‬‬ ‫ ;))(‪Console.WriteLine(item == null ? "null" : item.ToString‬‬ ‫‪ InvalidOperationException‬ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﭼﯩﻘﯩﺮﯨﺪﯗ//‬ ‫ ;)(‪item = products.Single‬‬ ‫ ;))(‪Console.WriteLine(item == null ? "null" : item.ToString‬‬ ‫‪ InvalidOperationException‬ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﭼﯩﻘﯩﺮﯨﺪﯗ//‬ ‫ >‪IEnumerable‪emptyProducts  Enumerable.Empty p.IdProduct‬‬ ‫ ;))(‪Console.WriteLine(item == null ? "null" : item.ToString‬‬ ‫‪SingleOrDefault‬‬ ‫‪ SingleOrDefault‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﻗﯘﺭﯗﻕ ﻳـﺎﻛﻰ ﺷـﻪﺭﺗﻜﻪ ﺋﯘﻳﻐـﯘﻥ ﺋﯧﻠﯧﻤﯧﻨـﺖ ﺑﻮﻟﻤﯩﻐـﺎﻥ ﺗﯩﺰﻣﯩـﺪﯨﻦ‬ ‫ﻛﯚﯕﯜﻟـــﺪﯨﻜﻰ ﻗﯩﻤﻤﻪﺗﻨـــﻰ ﻗﺎﻳﺘﯘﺭﯨـــﺪﯗ. ﺑـــﯘ ﻳﻪﺭﺩﯨﻜـــﻰ »ﻛﯚﯕﯜﻟـــﺪﯨﻜﻰ ﻗﯩﻤـــﻤﻪﺕ« ‪FirstOrDefault‬‬ ‫ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﺪﺍ ﺳﯚﺯﻟﻪﻧﮕﯩﻨﻰ ﺑﯩﻠﻪﻥ ﺋﻮﺧﺸﺎﺵ ﺑﯩﻠﻪﻥ ﺋﻮﺧﺸﺎﺵ.‬ ‫ﺋﻪﺳﻜﻪﺭﺗﯩﺶ: ‪ default‬ﻗﯩﻤﻤﻪﺕ ﭘﻪﻗﻪﺕ ﺷﻪﺭﺗﻜﻪ ﺋﯘﻳﻐـﯘﻥ ﺋﯧﻠﯧﻤﯧﻨـﺖ ﺗﯧﭙﯩﻠﻤﯩﻐﺎﻧـﺪﯨﻼ ﻗﺎﻳﺘﯩـﺪﯗ. ﺋﻪﮔﻪﺭ‬ ‫ﺗﯩﺰﻣﯩــــﺪﺍ ﺷــــﻪﺭﺗﻜﻪ ﺋﯘﻳﻐــــﯘﻥ ﺑﯩــــﺮﺩﯨﻦ ﺋــــﺎﺭﺗﯘﻕ ﺋﯧﻠﻤﯧﻨــــﺖ ﺑﻮﻟــــﯘﭖ ﻗﺎﻟــــﺴﺎﻕ ﻣﻪﺷــــﻐﯘﻻﺗﭽﻰ‬ ‫‪ InvalidOperationException‬ﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﭼﯩﻘﯩﺮﯨﺪﯗ.‬ ‫‪ ElementAt‬ﺑﯩﻠﻪﻥ ‪ElementAtOrDefault‬‬ ‫‪ ElementsAt‬ﺑﯩــﻠﻪﻥ ‪ ElementAtOrDefault‬ﺗﯩﺰﻣﯩﻨﯩــﯔ ﺑﻪﻟﮕﯩﻠﻪﻧــﮕﻪﻥ ﺋﻮﺭﯗﻧــﺪﯨﻜﻰ ﺋﯧﻠﯧﻤﯧﻨﺘﻨــﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﯧﻠﯩﺶ ﺋﯜﭼﯜﻥ ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺪﯗ:‬ www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 78 public static T ElementAt(      this IEnumerable source,      int index);  public static T ElementAtOrDefault(      this IEnumerable source,      int index); ‫ ﺗﻪ، ﭘﺎﺭﺍﻣﯧﺘﯩﺮ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻗﺎﻳﺴﻰ ﺋﻮﺭﯗﻧﺪﯨﻜﻰ ﺋﯧﻠﯧﻤﯧﻨﺘﻨـﻰ ﺋﯧﻠﯩـﺸﻨﻰ ﻛﯚﺭﺳـﯩﺘﯩﭗ ﺑﯧﻜﯩﺘﯩـﭗ‬ElementAt ‫ﺑﯧـﺮﯨﺶ ﻛﯧـﺮﻩﻙ. ﺗﻪﺭﺗﯩـﭗ ﻧﻮﻣـﯘﺭﻯ ﻧﯚﻟـﺪﯨﻦ ﺑﺎﺷـﻠﯩﻨﯩﺪﯗ. ﺩﯦـﻤﻪﻙ، ﺋﯩﻜﻜﯩﻨـﻰ ﻳﻮﻟﻠﯩـﺴﯩﯖﯩﺰ ﺋـﯜﭼﯩﻨﭽﻰ‬ ‫ﺋﯧﻠﯧﻤﯧﻨﺘﯩﻐﺎ ﺋﯧﺮﯨﺸﯩﺴﯩﺰ. ﺋﻪﮔﻪﺭ ﺑﻪﺭﮔﻪﻥ ﺳﺎﻧﯩﯖﯩﺰ ﻣﻪﻧﭙﯩـﻲ ﺑﻮﻟـﺴﺎ ﻳـﺎﻛﻰ ﺗﯩﺰﻣـﺎ ﺳـﺎﻥ ﭼﻪﻛﻠﯩﻤﯩـﺴﯩﺪﯨﻦ‬ .‫ ﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﭼﯩﻘﯩﺮﯨﺪﯗ‬ArgumentOutOfRangeException ‫ﺋﯧﺸﯩﭗ ﻛﻪﺗﺴﻪ، ﻣﻪﺷﻐﯘﻻﺕ‬ ،‫ ﺗﯩﻜﻰ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﻗﻮﻳﯘﭖ ﺑﯧﺮﯨـﺪﯨﻐﺎﻥ ﺋﻪﮬـﯟﺍﻟﻼﺭﺩﺍ‬ElementAt ،‫ ﺗﺎ ﺑﻮﻟﺴﺎ‬ElementAtOrDefault ‫ﺑﯩﻨﻮﺭﻣـﺎﻟﻠﯩﻖ ﻗﻮﻳـﯘﭖ ﺑﯧﺮﯨـﺸﻨﯩﯔ ﺋﻮﺭﻧﯩﻐـﺎ ﻛﯚﯕﯜﻟـﺪﯨﻜﻰ ﻗﯩﻤـﻤﻪﺕ ﻗﺎﻳﺘﯘﺭﯨـﺪﯗ. ﻗـﺎﻳﺘﯘﺭﯗﺵ ﭘﯩﺮﯨﻨـﺴﯩﭙﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ ﻧﯩﯖﻜــﻰ ﺑﯩــﻠﻪﻥ ﺋﻮﺧــﺸﺎﺵ. ﺗﯚﯞﻩﻧــﺪﻩ ﺋﯘﻻﺭﻧﯩــﯔ ﺋﯩﺸﻠﯩﺘﯩﻠﯩــﺸﯩﮕﻪ ﺋﺎﺋﯩــﺖ ﻣﯩــﺴﺎﻝ‬FirstOrDefault :‫ﺑﯧﺮﯨﻠﺪﻯ‬ 4.52 ‫ﻛﻮﺩ‬ // ‫ ﻧﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ‬Product 2 var item = products.ElementAt(2);  Console.WriteLine(item == null ? "null" : item.ToString());    // ‫ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ‬null  item = Enumerable.Empty().ElementAtOrDefault(6);  Console.WriteLine(item == null ? "null" : item.ToString());    // ‫ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ‬null  item = products.ElementAtOrDefault(6);  Console.WriteLine(item == null ? "null" : item.ToString());  DefaultIfEmpty :‫ ﻗﯘﺭﯗﻕ ﺗﯩﺰﻣﺎ ﺋﯜﭼﯜﻥ ﻛﯚﯕﻠﯩﺪﯨﻜﻰ ﻗﯩﻤﻤﻪﺗﻨﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ‬DefaultIfEmpty public static IEnumerable DefaultIfEmpty(      this IEnumerable source);  public static IEnumerable DefaultIfEmpty(      this IEnumerable source,      T defaultValue); ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫97‬ ‫ﺑﻪﻟﮕﯩﻠﯩﻤﯩﺴﻰ ﺑﻮﻳﯩﭽﻪ، ﺋﯘ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭ ﺗـﻮﭘﯩﻨﻰ ﻗﺎﻳﺘﯘﺭﯨـﺪﯗ. ﺋﻪﮔﻪﺭ ﻣﻪﻧـﺒﻪ ﺗﯩﺰﻣـﺎ ﻗـﯘﺭﯗﻕ‬ ‫ﺑﻮﻟﺴﺎ، ﺑﯩﺮﯨﻨﭽﻰ ﺋﻪﻧﺪﯨﺰﯨﺪﻩ )‪ default(T‬ﻧﻰ، ﺋﯩﻜﻜﯩﻨﭽﻰ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﺪﻩ ﭘﺎﺭﺍﻣﯧﺘﯩﺮ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺑﯧﺮﯨﻠﮕﻪﻥ‬ ‫‪ defaultValue‬ﻧﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ.‬ ‫ﺧﺎﺳﻼﺷﺘﯘﺭﯗﻟﻐﺎﻥ ﻛﯚﯕﯜﻟﺪﯨﻜﻰ ﻗﯩﻤﻤﻪﺕ ﻗﯘﺭﯗﯞﯦﻠﯩﺸﻨﯩﯔ ﭘﺎﻳﺪﯨﺴﻰ ﻛﯚﭖ. ﻣﻪﺳﯩﻠﻪﻥ، ﮬﯧﭽﻘﺎﻧﺪﺍﻕ‬ ‫ﺋﯘﭼﯘﺭﻯ ﺑﻮﻟﻤﯩﻐﺎﻥ ﻗﯘﺭﯗﻕ ﺧﯧﺮﯨﺪﺍﺭ ﻻﺯﯨﻢ ﺑﻮﻟﻐﺎﻧﺪﺍ ‪ Empty‬ﻧﺎﻣﻠﯩﻖ ﺧﺎﺳﻠﯩﻖ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺋﯧﺮﯨﺸﻜﯩﻠﻰ‬ ‫ﺑﻮﻟﯩﺪﯨﻐﺎﻥ ﻗﯩﻠﺴﺎﻕ ﻣﯘﻧﺪﺍﻕ ﻳﺎﺯﯨﻤﯩﺰ:‬ ‫ { ‪public static Customer Empty‬‬ ‫ { ‪    get‬‬ ‫ ;)(‪        Customer empty = new Customer‬‬ ‫ ;‪        empty.Name = String.Empty‬‬ ‫ ;‪        empty.Country = Countries.Italy‬‬ ‫ ;‪        empty.City = String.Empty‬‬ ‫ ‪        empty.Orders = (new‬‬ ‫ ;)(‪List(Enumerable.Empty())).ToArray‬‬ ‫ ;)‪       return(empty‬‬ ‫ }    ‬ ‫}‬ ‫ﺑﻪﺯﯨﺪﻩ ﺑﯘﻧـﺪﺍﻕ ﻗﯩﻠﯩـﺶ ﻳﺎﺧـﺸﻰ ﺋﯩـﺶ، ﺑﻮﻟﯘﭘﻤـﯘ ﺑـﯚﻟﻪﻙ ﺳـﯩﻨﯩﻘﻰ ﺋﯧﻠﯩـﭗ ﺑﺎﺭﻏﺎﻧـﺪﺍ ﺋﯩﻨﺘـﺎﻳﯩﻦ ﺋﻪﺱ‬ ‫ﻗﺎﺗﯩﺪﯗ. ﺋﯘﻧﯩﯖﺪﯨﻦ ﺑﺎﺷﻘﺎ، ﺳﯜﺭﯛﺷـﺘﯜﺭﯛﻙ ‪ GroupJoin‬ﻧـﻰ ﺋﯩـﺸﻠﯩﺘﯩﭗ ﺳـﻮﻝ- ﺳـﯩﺮﺗﻘﻰ ﮬﻪﻣـﺪﻩﻣﻨﻰ‬ ‫ﺑﺎﻳﻘﯩﻐﺎﻧﺪﺍ، ‪ Null‬ﺑﻮﻟﯘﺵ ﺋﯧﮫﺘﯩﻤﺎﻟﻠﯩﻘﻰ ﺑﻮﻟﻐﺎﻥ ﻧﻪﺗﯩﺠﯩﻨﻰ ﻛﯚﯕﯜﻟـﺪﯨﻜﻰ ﻗﯩﻤﻤﻪﺗـﻜﻪ ﺋﺎﻳﻼﻧـﺪﯗﺭﯗﯞﯦﺘﯩﺶ‬ ‫ﻳﺎﺧﺸﻰ ﺋﺎﺩﻩﺕ.‬ ‫ﺗﯚﯞﻩﻧﺪﻩ ‪ DefaultEmpty‬ﻧﻰ ﺋﯩﺸﻠﯩﺘﯩﺸﺘﯩﻦ ﺑﯩﺮ ﻣﯩﺴﺎﻝ:‬ ‫ﻛﻮﺩ 35.4‬ ‫ ;)(‪var expr = customers.DefaultIfEmpty‬‬ ‫ ‬ ‫ ‪var customers = Enumerable.Empty(); // Empty array‬‬ ‫ = ‪IEnumerable customersEmpty‬‬ ‫ ;)‪    customers.DefaultIfEmpty(Customer.Empty‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫08‬ ‫ﺑﺎﺷﻘﺎ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻼﺭ‬ ‫‪ Concat‬ﺑﯩﻠﻪﻥ ‪ SequanceEqual‬ﻣﻪﺯﻛﯘﺭ ﭘﺎﺭﺍﮔﺮﺍﻓﺘﯩﻜﻰ ﺋﻪﯓ ﺋﺎﺧﯩﺮﯨﻘﻰ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻼﺭ.‬ ‫‪) Concat‬ﺋﯘﻻﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ(‬ ‫‪ Concat‬ﺑﯩ ـﺮ ﺗﯩﺰﻣﯩﻨ ـﻰ ﻳﻪﻧﻪ ﺑﯩ ـﺮ ﺗﯩﺰﻣﯩﻐ ـﺎ ﺋ ـﯘﻻﺵ ﺋﯧﻠﯩ ـﭗ ﺑﺎﺭﯨ ـﺪﯨﻐﺎﻥ ﺑﻮﻟ ـﯘﭖ ﺋﯘﻧﯩ ـﯔ ﺋﻪﻧ ـﺪﯨﺰﯨﻠﯩﺮﻯ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ:‬ ‫ (>‪public static IEnumerable Concat first‬‬ ‫;)‪    IEnumerable second‬‬ ‫ﻛﯚﺭﯨﯟﯦﻠﯩﺸﻘﺎ ﺑﻮﻟﯩﺪﯗ، ‪ Concat‬ﺋﺎﺭﻗﯩﻠﯩﻖ >‪ IEnumerable‪public static bool SequenceEqual first‬‬ ‫ ;)‪    IEnumerable second‬‬ ‫ (>‪public static bool SequenceEqual first‬‬ ‫ ,‪    IEnumerable second‬‬ ‫;)‪    IEqualityComparer comparer‬‬ ‫ﺳﯧﻠﯩﺸﺘﯘﺭﯗﺵ ﺟﻪﺭﻳﺎﻧﯩﺪﺍ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﮬﻪﺭﺑﯩﺮ ﺋﻪﺯﺍ ﻧﯩﺸﺎﻥ ﺗﯩﺰﻣﯩـﺪﯨﻜﻰ ﺋـﯚﺯﻯ ﺑﯩـﻠﻪﻥ ﺋﻮﺧـﺸﺎﺵ‬ ‫ﺋﻮﺭﯗﻧﺪﯨﻜﻰ ﺋﻪﺯﺍ ﺑﯩﻠﻪﻥ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﻟﯘﭖ ﭼﯩﻘﯩﺪﯗ. ﺋﻪﮔﻪﺭ ﺋﯩﻜﻜـﻰ ﺗﯩﺰﻣﯩﻨﯩـﯔ ﺑـﺎﺭﻟﯩﻖ ﺋﻪﺯﺍﻟﯩـﺮﻯ ﺋـﻮﺭﯗﻥ‬ ‫ﺟﻪﮬﻪﺗــﺘﯩﻦ ﯞﻩ ﺳــﺎﻥ ﺟﻪﮬﻪﺗــﺘﯩﻦ ﺋﻮﺧــﺸﺎﺵ ﭼﯩﻘــﺴﺎ ﺋﺎﻧــﺪﯨﻦ ﺭﺍﺳــﺖ ﻗﺎﻳﺘﯩــﺪﯗ، ﺧﺎﻟﯩﻐــﺎﻥ ﺑﯩﺮﺳــﻰ‬ ‫ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﻤﯩــﺴﻪ ﻳﺎﻟﻐــﺎﻥ ﻗﺎﻳﺘﯩــﺪﯗ. ﺋﻪﮔﻪﺭ ﺗﯩﺰﻣﯩــﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭ ﭼﺎﻗﯩﺮﯨﻠﻤــﺎ ﺗﯩﭙﻠﯩــﻖ ﺑﻮﻟــﺴﺎ، ﺋﯘﻧﯩــﯔ‬ ‫ﺳﯧﻠﯩﺸﺘﯘﺭﯗﻟﯘﻕ ﺧـﯘﻟﻘﯩﻨﻰ ﻗـﻮﻝ ﺋـﺎﺭﻗﯩﻠﯩﻖ ﺋﯚﺯﮔﻪﺭﺗﯩـﺸﯩﯖﯩﺰ ﻛﯧـﺮﻩﻙ. ﻳـﺎﻛﻰ ﺋﯩﻜﻜﯩﻨﭽـﻰ ﺧﯩـﻞ ﺋﻪﻧـﺪﯨﺰﻩ‬ ‫ﺋﺎﺭﻗﯩﻠﯩﻖ ﺧﺎﺳﻼﺷﺘﯘﺭﯗﻟﻐﺎﻥ ﺳﯧﻠﯩﺸﺘﯘﺭﻏﯘﭺ ﺑﯩﻠﻪﻥ ﺗﻪﻣﯩﻨﻠﯩﺴﯩﯖﯩﺰﻣﯘ ﺑﻮﻟﯩـﺪﯗ. )ﺑـﯘ ﺗﻮﻏﺮﯨﻠﯩـﻖ ﺋﺎﻟـﺪﯨﻨﻘﻰ‬ ‫ﻣﻪﺯﻣﯘﻧﻼﺭﺩﺍ ﺗﻮﺧﺘﺎﻟﻐﺎﻥ(‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫28‬ ‫ﻛﯧﭽﯩﻜﺘﯜﺭﯛﻟﻤﻪ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﻨﯩﯔ ﻗﯩﻤﻤﻪﺗﻠﯩﻨﯩﺸﻰ ﯞﻩ ﻛﯧﯖﻪﻳـﺘﯩﻠﻤﻪ ﻣﯧﺘـﻮﺩ‬ ‫ﭼﺎﺭﯨﺴﻰ‬ ‫]‪[Deferred Query Evaluation and Extension Methods Resolution, 延迟的查询赋值与扩展方法‬‬ ‫ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﻣﯘﺷﯘ ﭘﺎﺭﺍﮔﺮﺍﻓﻨﯩﯔ ﺋﺎﺧﯩﺮﯨﺪﺍ ﺳﯚﺯﻟﯩﻨﯩﺪﯗ( ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﻧﻪﺗﯩﺠﯩﺴﯩﻨﻰ‬ ‫ﺋﻮﺧﺸﯩﻤﯩﻐﺎﻥ ﺷﻪﻛﯩﻠﻠﻪﺭﺩﻩ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﺍﻻﻳﺪﯗ. ﺑﯘ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻼﺭﻏﺎ ﺑﻮﻟﻐﺎﻥ ﺋﯧﮫﺘﯩﻴـﺎﺟﻨﻰ ﭼﯜﺷـﻪﻧﺪﯛﺭﯛﺵ‬ ‫ﺋﯜﭼــﯜﻥ ‪ Linq‬ﻧﯩــﯔ »ﻛﯧﭽﯩﻜﺘــﯜﺭﯛﻟﻤﻪ ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻛﻨﯩﯔ ﻗﯩﻤﻤﻪﺗﻠﯩﻨﯩــﺸﻰ« ﯞﻩ »ﻛﯧﯖﻪﻳــﺘﯩﻠﻤﻪ ﻣﯧﺘــﻮﺩ‬ ‫ﭼﺎﺭﯨﺴﻰ« ﻻﺭﺩﯨـﻦ ﺋﯩﺒـﺎﺭﻩﺕ ‪ Linq‬ﻧﯩـﯔ ﺑـﺎﺭﻟﯩﻖ ﺋﻪﻣﻪﻟـﮕﻪ ﺋﺎﺷـﯘﺭﯗﻟﻤﯩﻠﯩﺮﻯ ﺋﯜﭼـﯜﻥ ﺋﯩﻨﺘـﺎﻳﯩﻦ ﻣـﯘﮬﯩﻢ‬ ‫ﺑﻮﻟﻐﺎﻥ ﺋﯩﻜﻜﻰ ﺧـﯘﻟﻘﯩﻨﻰ ﺑﺎﻳـﺎﻥ ﻗﯩﻠﯩـﺶ ﺯﯙﺭﯛﺭ. ﺷـﯘﯕﺎ ﻣﻪﺯﻛـﯘﺭ ﭘـﺎﺭﺍﮔﺮﺍﻓﻨﻰ ﺗﯧﺨﯩﻤـﯘ ﺋﻪﺳـﺘﺎﻳﯩﺪﯨﻠﻠﯩﻖ‬ ‫ﺑﯩﻠﻪﻥ ﻛﯚﺭﯛﺷﯩﯖﯩﺰﻧﻰ ﺋﯜﻣﯩﺪ ﻗﯩﻠﯩﻤﻪﻥ.‬ ‫ﻛﯧﭽﯩﻜﺘﯜﺭﯛﻟﻤﻪ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﻨﯩﯔ ﻗﯩﻤﻤﻪﺗﻠﯩﻨﯩﺸﻰ‬ ‫‪ Linq‬ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻛﻠﯩﺮﻯ ﺋﯧﻨﯩﻘﻼﻧﻐﺎﻧــﺪﺍ ﺋﻪﻣﻪﺱ ﺑﻪﻟﻜــﻰ ﺋﯩــﺸﻠﯩﺘﯩﻠﮕﻪﻧﺪﯨﻼ ﺋﺎﻧــﺪﯨﻦ ﺋﯩﺠــﺮﺍ ﺑﻮﻟﯩــﺪﯗ.‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﯩﮕﻪ ﻗﺎﺭﺍﯓ:‬ ‫ ;)‪List customersList = new List(customers‬‬ ‫ ‬ ‫ = ‪var expr‬‬ ‫ ‪    from   c in customersList‬‬ ‫ ‪    where  c.Country == Countries.Italy‬‬ ‫;‪    select c‬‬ ‫ﻳﯘﻗﯩﺮﯨﻘﻰ ﻛﻮﺩ ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻜﻰ ‪ Italy‬ﺑﻮﻟﻐﺎﻥ ﺧﯧﺮﯨﺪﺍﺭﻻﺭ ﺗﯩﺰﻣﯩﺴﯩﻐﺎ ﺋﯧﺮﯨﺸﯩﺪﯗ. ﺋﻪﮔﻪﺭ‬ ‫;))(‪Console.WriteLine("\nItems after query definition: {0}", expr.Count‬‬ ‫ﻧﻰ ﺋﯩﺠﺮﺍ ﻗﯩﻠﺴﺎﻕ، ﺑﯩﺰﻧﯩﯔ ﺑﯘﺭﯗﻥ ﺑﯧﻜﯩﺘﯩﯟﺍﻟﻐﺎﻥ ﻣﯩـﺴﺎﻝ ﺋﯘﭼﯘﺭﻟﯩﺮﯨﻤﯩﺰﻏـﺎ ﺋﺎﺳﺎﺳـﻪﻥ،ﻧﻪﺗﯩﺠﻪ ﺋﯩﻜﻜـﻰ‬ ‫ﭼﯩﻘﯩﺪﯗ، ﻳﻪﻧﻰ ﺋﯩﭙﺎﺩﯨﺪﯨﻜﻰ ﺷﻪﺭﺗﻜﻪ ﭼﯜﺷﯩﺪﯨﻐﺎﻥ ﺋﯩﻜﻜﻰ ﺧﯧﺮﯨﺪﺍﺭ ﺑﺎﺭ. ﺋﻪﻣﺪﻯ ﻳﯧﯖـﻰ ﺧﯧﺮﯨـﺪﺍﺭﻻﺭﻧﻰ‬ ‫ﻗﻮﺷﯘﺵ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﻨﻰ ﺋﯚﺯﮔﻪﺭﺗﻪﻳﻠﻰ )ﻳﯘﻗﯩﺮﯨﻘﻰ ﻛﻮﺩﯨﻨﯩﯔ ﻛﻪﻳﻨﯩﺪﯨﻨﻼ(:‬ ‫ (‪customersList.Add‬‬ ‫ ,"‪  new Customer {Name = "Roberto", City = "Firenze‬‬ ‫ { ][‪    Country = Countries.Italy, Orders = new Order‬‬ ‫ ,‪    new Order {Quantity = 3, IdProduct = 1 , Shipped = false‬‬ ‫ ;)}}}"‪      Month = "March‬‬ ‫ﺋﻪﻣﺪﻯ ﻧﻪﺗﯩﺠﻪ ﺗﯩﺰﻣﯩﺴﻰ ‪ expr‬ﻧﯩﯔ ﭼﺎﺭﻟﯩﺴﺎﻕ ﻳﺎﻛﻰ ﺋﯘﻧﯩﯖﺪﯨﻜﻰ ﺋﻪﺯﺍ ﺳﺎﻧﯩﻨﻰ ﺗﻪﻛﺸﯜﺭﺳﻪﻙ، ﻧﻪﺗﯩﺠﻪ‬ ‫ﺋﺎﻟﺪﯨﻨﻘﻰ ﻗﯧﺘﯩﻤﺪﯨﻜﯩﺪﻩﻙ ﭼﯩﻘﻤﺎﻳﺪﯗ )ﺋﺎﻟﺪﯨﻨﻘﻰ ﻗﯧﺘﯩﻢ ﺋﯩﻜﻜﻰ ﺋﯩﺪﻯ(. ﻳﻪﻧﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻛﻮﺩﯨﻨﻰ ﺋﯩﺠﺮﺍ‬ ‫ﻗﯩﻠﯩﭗ ﻛﯚﺭﺳﻪﻙ:‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫38‬ ‫ﻛﻮﺩ 55.4‬ ‫ :‪Console.WriteLine("\nItems after source sequence modification‬‬ ‫ ;))(‪{0}", expr.Count‬‬ ‫ ‬ ‫ { )‪foreach (var item in expr‬‬ ‫ ;)‪    Console.WriteLine(item‬‬ ‫ }‬ ‫ﻧﻪﺗﯩـــﺠﻪ ﺗﯚﯞﻩﻧﺪﯨﻜﯩـــﺪﻩﻙ ﭼﯩﻘﯩـــﺪﯗ. ﺩﯨﻘـــﻘﻪﺕ ﻗﯩﻠﯩـــﯔ، ﮔﻪﺭﭼﻪ ‪ Roberto‬ﺋﯩـــﺴﯩﻤﻠﯩﻚ ﺧﯧﺮﯨـــﺪﺍﺭ‬ ‫ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨــﺴﯩﻨﻰ ﺋﯧــﻨﯩﻘﻼﭖ )ﻳﯧﺰﯨــﭗ( ﺑﻮﻟﻐﺎﻧــﺪﯨﻦ ﻛﯧــﻴﯩﻦ ﻗﻮﺷــﯘﻟﻐﺎﻥ ﺑﻮﻟــﺴﯩﻤﯘ، ﻟــﯧﻜﯩﻦ‬ ‫ﻧﻪﺗﯩﺠﯩﺪﻩ ﻳﻪﻧﯩﻼ ﺑﺎﺭ.‬ ‫3 :‪Items after source sequence modification‬‬ ‫‪Paolo - Brescia – Italy‬‬ ‫‪Marco - Torino – Italy‬‬ ‫‪Roberto - Firenze - Italy‬‬ ‫ﺋﻪﺳﻜﻪﺭﺗﯩﺶ: ‪ Linq‬ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﯩﻨﯩﯔ ﻟﻮﮔﯩﻜﯩﺴﯩﺪﯨﻦ ﻗﺎﺭﯨﻐﺎﻧﺪﺍ، ﺋﯘﻧﯩﯔ ﺋﯩﭙﺎﺩﯨﻠﻪﻳﺪﯨﻐﯩﻨﻰ‬ ‫»ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﭘﯩﻼﻧﻰ« ﺧﺎﻻﺱ. ﭼﯜﻧﻜﻰ ﺋﯘ ﺗﺎﻛﻰ ﺋﯘﻧﻰ ﺋﯩﺸﻠﻪﺗﻜﯜﭼﻪ ﺋﯩﺠﺮﺍ ﺑﻮﻟﻤﺎﻳﺪﯗ. ﮬﻪﺭ ﻗﯧﺘﯩﻢ ﻗﺎﻳﺘﺎ‬ ‫ﺋﯩﺸﻠﯩﺘﯩﺶ ﺋﯘﻧﯩﯔ ﻗﺎﻳﺘﺎ ﺋﯩﺠﺮﺍ ﺑﻮﻟﯘﺷﯩﻨﻰ ﻛﻪﻟﺘﯜﺭﯛﭖ ﭼﯩﻘﯩﺮﯨﺪﯗ. ﺑﻪﺯﻯ ‪ Linq‬ﻧﯩﯔ ﺋﻪﻣﻪﻟﮕﻪ‬ ‫ﺋﺎﺷﯘﺭﻣﯩﻠﯩﺮﻯ، ﻣﻪﺳﯩﻠﻪﻥ: ‪ ،Linq to Objects‬ﺋﯘﺷﺒﯘ ﺧﯘﻟﻘﯩﻨﻰ ﻣﯘﯞﻩﻗﻘﻪﺗﻠﻪﺭ)‪ (delegates‬ﺋﺎﺭﻗﯩﻠﯩﻖ‬ ‫ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﺎﻥ. ﻟﯧﻜﯩﻦ ‪ Linq to Sql‬ﺑﻮﻟﺴﺎ ﺋﯘﻧﻰ ﺋﯩﭙﺎﺩﻩ ﺩﻩﺭﯨﺨﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﺎﻥ.‬ ‫»ﻛﯧﭽﯩﻜﺘﯜﺭﯛﻟﻤﻪ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻛﻨﯩﯔ ﻗﯩﻤﻤﻪﺗﻠﯩﻨﯩﺸﻰ« ﻧـﻰ ﺑﯩـﺮﻻ ﻗﯧـﺘﯩﻢ ﺋﯧـﻨﯩﻘﻼﭖ ﺗﻪﻛـﺮﺍﺭ ﺋﯩـﺸﻠﻪﺗﻜﯩﻠﻰ‬ ‫ﺑﻮﻟﻐﺎﻧﻠﯩﻘﻰ ﺋﯜﭼـﯜﻥ، ﺋـﯘ ﻧﯘﺭﻏـﯘﻥ ﻗـﻮﻻﻳﻠﯩﻘﻼﺭﻧﻰ ﺋﯧﻠﯩـﭗ ﻛﻪﻟـﮕﻪﻥ. ﻣﻪﻧـﺒﻪ ﺗﯩﺰﻣـﺎ ﻣﻪﺯﻣﯘﻧﯩﻐـﺎ ﻗﺎﻧـﺪﺍﻕ‬ ‫ﺋﯚﺯﮔﯩﺮﯨﺸﻠﻪﺭﻧﯩﯔ ﺑﻮﻟﯘﺷﯩﺪﯨﻦ ﻗﻪﺗﺌﯩﻲ ﻧﻪﺯﻩﺭ، ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﻧﻪﺗﺠﯩـﺴﻰ ﮬﺎﻣـﺎﻥ ﻣﻪﻧـﺒﻪ ﺗﯩﺰﻣﯩﻨﯩـﯔ ﺋﻪﯓ‬ ‫ﻳﯧﯖﻰ ﻣﻪﺯﻣﯘﻧﯩﻨﻰ ﺋﺎﺳﺎﺱ ﻗﯩﻠﯩﺪﯗ.‬ ‫ﺑﯩﺮﺍﻕ، ﺑﯘﻧﯩﺴﻰ ﺩﺍﺋﯩـﻢ ﻗﻮﻻﻳﻠﯩـﻖ ﺑﻮﻟﯘﺷـﻰ ﻧﺎﺗـﺎﻳﯩﻦ. ﺋﻪﮔﻪﺭ ﺋﻮﺧـﺸﯩﻤﯩﻐﺎﻥ ﭘﻪﻳﺘﺘﯩﻜـﻰ ﻣﻪﻧـﺒﻪ ﺗﯩﺰﻣﯩﻐـﺎ‬ ‫ﺋﺎﻟﻤﺎﺷـﺘﯘﺭﯗﺵ‬ ‫ﻧﯩﺴﺒﻪﺗﻪﻥ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﻩ ﻧﻪﺗﯩﺠﯩـﺴﯩﻨﻰ ﺳـﺎﻗﻼﭖ ﻗﺎﻟﻤـﺎﻗﭽﻰ ﺑﻮﻟـﺴﯩﯖﯩﺰﭼﯘ؟...‬ ‫ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﻳﺎﺭﺩﻩﻡ ﻗﯩﻠﯩﺪﯗ.‬ www.udmish.cn ‫ ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬LINQ 84 ‫ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪ ﻣﯧﺘﻮﺩ ﭼﺎﺭﯨﺴﻰ‬ .‫ ﻧﻰ ﺋﯩﮕﯩﻠﻪﺵ ﺟﻪﺭﻳـﺎﻧﯩﯖﯩﺰﺩﯨﻜﻰ ﺋﻪﯓ ﻣـﯘﮬﯩﻢ ﺋﯘﻗﯘﻣﻼﺭﻧﯩـﯔ ﺑﯩـﺮﻯ‬Linq ‫ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪ ﻣﯧﺘﻮﺩ ﭼﺎﺭﯨﺴﻰ‬ ‫ ﻧـﺎﻣﻠﯩﻖ ﺋﯚﺯﯨﻤﯩﺰﻧﯩـﯔ ﺧﯧﺮﯨـﺪﺍﺭﻻﺭ ﺗﯩﺰﻣـﺎ ﺗﯩﭙﯩﻨـﻰ‬Customers ،‫ﺗﯚﯞﻩﻧـﺪﯨﻜﻰ ﻛﻮﺩﻗـﺎ ﻗـﺎﺭﺍﯓ. ﺋﯘﻧﯩﯖـﺪﺍ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ ﻧــﻰ ﻛﯧﯖﻪﻳــﺘﯩﻠﮕﻪﻥ ﻣﯧﺘــﻮﺩﻻﺭ ﺑﯩــﻠﻪﻥ ﺗﻪﻣﯩﻨﻠﻪﻳــﺪﯨﻐﺎﻥ‬Customers ‫ﺋﯧﻨﯩﻘﻠﯩــﺪﯗﻕ. ﺋﯘﻧﯩﯖــﺪﯨﻦ ﺑﺎﺷــﻘﺎ‬ ‫ ﺋﺎﻻﮬﯩ ـﺪﻩ ﻣﻪﺷ ـﻐﯘﻻﺕ‬Customers ‫ ﻧ ـﺎﻣﻠﯩﻖ ﺗ ـﯜﺭ ﻗ ـﯘﺭﺩﯗﻕ. ﺋﯘﻧﯩ ـﯔ ﺋﯩﭽﯩ ـﺪﻩ‬CutomersEnumerable ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ :‫ ﻧﺎﻣﻠﯩﻖ ﻛﯧﯖﻪﻳﻤﻪ ﻣﯧﺘﻮﺩﻧﻰ ﺋﯧﻨﯩﻘﻠﯩﺪﯗﻕ‬Where ‫ﺋﯧﻠﯩﭗ ﺑﺎﺭﯨﺪﯨﻐﺎﻥ‬ public sealed class Customers: List {      public Customers(IEnumerable items): base(items) {}  }    public static class CustomersEnumerable {      public static IEnumerable Where(          this Customers source, Func predicate)  { ... }        public static IEnumerable Where(          this  Customers  source,  Func  predicate)  { ... }  } ‫ ﺗﯩﺰﻣﯩﺴﯩﻨﻰ ﺋﯩﺸﻠﺘﯩﭗ ﻛـﻮﺩ 65.4 ﺩﯨﻜﯩـﺪﻩﻙ‬customers ‫ﺋﻪﮔﻪﺭ ﺑﺎﺷﺘﯩﻦ ﺑﯧﺮﻯ ﺋﯩﺸﻠﯩﺘﯩﭗ ﻛﯧﻠﯩﯟﺍﺗﻘﺎﻥ‬ :‫ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ﻳﺎﺯﺳﺎﻕ‬ 4.56 ‫ﻛﻮﺩ‬ Customers customersList = new Customers(customers);    var expr =      from   c in customersList      where  c.City == "Brescia"      select c;    foreach (var item in expr) {      Console.WriteLine(item);  }  ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫58‬ ‫ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤﺎﻥ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﯩﻨﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻛﻮﺩﻗﺎ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯨﺪﯗ.‬ ‫ = ‪var expr‬‬ ‫ ‪    customersList‬‬ ‫ )"‪    .Where(c => c.City == "Brescia‬‬ ‫ ;)‪    .Select(c => c‬‬ ‫ﺑﯩ ـﺰ ﺑﺎﻳ ـﺎﻡ ﻗﯘﺭﯨﯟﺍﻟﻐ ـﺎﻥ ‪ Customers‬ﺗ ـﯜﺭﯨﻤﯩﺰ ﺋﯜﭼ ـﯜﻥ ﺗ ـﯜﺯﮔﻪﻥ ‪ CustomersEnumerable‬ﺗﯘﺭﺍﻗﻠﯩ ـﻖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺗﯜﺭﯨــﺪﻩ ‪ Where‬ﻧــﺎﻣﻠﯩﻖ ﻛﯧﯖﻪﻳــﺘﻤﻪ ﻣﯧﺘﻮﺩﻧﯩــﯔ ﺋﯧﻨﯩﻘﻠﯩﻤﯩــﺴﻰ ﺑﯧﺮﯨﻠﮕﻪﻧﻠﯩﻜــﻰ ﺋﯜﭼــﯜﻥ، ﻳــﯘﻗﯩﺮﯨﻘﻰ‬ ‫‪Where(c‬ﺑﻮﻟـــﺴﺎ‬ ‫>=‬ ‫‪c.City‬‬ ‫==‬ ‫ﺋﺎﻟﻤﺎﺷـــﺘﯘﺭﯗﺵ ﺟﻪﺭﻳﺎﻧﯩـــﺪﺍ ﺋﯩـــﺸﻠﯩﺘﯩﻠﮕﻪﻥ )"‪"Brescia‬‬ ‫‪ System.Linq.Enumerable‬ﺩﺍ ﺗﻪﻣﯩـــﻨﻠﻪﻧﮕﻪﻥ، ﺗﯩﺰﻣﯩﻼﺭﻏـــﺎ ﺋﻮﺭﺗـــﺎﻕ ﺋﯩـــﺸﻠﯩﺘﯩﻠﯩﺪﯨﻐﺎﻥ ‪Where‬‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺑﻮﻟﻤﺎﺳﺘﯩﻦ ﺑﻪﻟﻜﻰ ‪ CustomersEnumerable‬ﺩﯨﻜﻰ ﻛـﯧﯖﻪﻳﻤﻪ ﻣﯧﺘﻮﺩﺗـﯘﺭ.)‪CustomersEnumerable‬‬ ‫ﺗﯜﺭﻯ ﭼﻮﻗـﯘﻡ ﻣﻪﺯﻛـﯘﺭ ﺗـﯜﺭ ﺋﯩﭽﯩـﺪﻩ ﺑﻮﻟﯘﺷـﻰ، ﻳـﺎﻛﻰ ﭼﺎﻗﯩﺮﯨﻠﻐـﺎﻥ ﺑﻮﻟﯘﺷـﻰ ﻛﯧـﺮﻩﻙ(. ﺋﻪﻣـﺪﻯ ‪Linq‬‬ ‫ﻛﯜﭼﯩﻨﯩﯔ ﮬﻪﻗﯩﻘﻰ ﻣﺎﮬﯩﻴﯩﺘﯩﻨﻰ ﭼﯜﺷﻪﻧﮕﻪﻧﺪﻩﻙ ﺑﻮﻟﯩﯟﺍﺗﻘﺎﻧﺴﯩﺰ؟...‬ ‫ﻛﯧﯖﻪﻳـﺘﯩﻠﻤﻪ ﻣﯧﺘـﻮﺩ ﺋ ـﺎﺭﻗﯩﻠﯩﻖ ﻧـﯚﯞﻩﺗﺘﻪ ﺑـﺎﺭ ﺑﻮﻟﻐ ـﺎﻥ ﺗـﯜﺭﻟﻪﺭﮔﻪ ﯞﺍﺭﯨـﺴﻠﯩﻖ ﻗﯩﻠﻤ ـﺎﻱ ﺗﯘﺭﯗﭘﻤـﯘ ﺋﯘﻧﯩ ـﯔ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺋﯩﻘﺘﯩﺪﺍﺭﯨﻨﻰ ﻳﯘﻗﯩﺮﻯ ﻛﯚﺗﯜﺭﻩﻟﻪﻳﻤﯩﺰ. ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ، ﺑﯩﺰ ﻛﯧﻴﯩﻦ ﺳﯚﺯﻟﯩﻤﻪﻛﭽﻰ ﺑﻮﻟﻐﺎﻥ ,‪Linq to Sql‬‬ ‫‪ Linq‬ﻟﻪﺭ ﺑﻮﻟ ــﺴﺎ، ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻙ ﻣﻪﺷ ــﻐﯘﻻﺗﭽﯩﻠﯩﺮﻧﯩﯔ ﻗﺎﻳﺘــﺎ ﺋﻪﻣﻪﻟ ــﮕﻪ ﺋﺎﺷ ــﯘﺭﯗﻟﯘﭖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫‪to‬‬ ‫‪XML‬‬ ‫ﺧﺎﺳﻼﺷﺘﯘﺭﯗﻟﻐﺎﻧﻠﯩﺮﯨﺪﯗﺭ، ﺧﺎﻻﺱ.‬ ‫ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ‬ ‫ﺋﺎﻟﻤﺎﺷــﺘﯘﺭﯗﺵ ﻣﻪﺷــﻐﯘﻻﺗﭽﯩﻠﯩﺮﯨﻐﺎ ﺗﻪﯞﻩ ﻣﻪﺷــﻐﯘﻻﺗﭽﯩﻼﺭﺩﯨﻦ ‪،ToList ،ToArray ،AsEnumerable‬‬ ‫‪ OfType ،ToLookup ،ToDictionary‬ﯞﻩ ‪ Cast‬ﻗﺎﺗﺎﺭﻟﯩﻘﻼﺭ. ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻣﻪﺷـﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺑﯩـﺰ‬ ‫ﺋﺎﻟــــﺪﯨﻨﻘﻰ ﻣﻪﺯﻣــــﯘﻧﻼﺭﺩﺍ ﺋﯘﭼﺮﯨﻐــــﺎﻥ ﺑﯩــــﺮ ﻗﯩــــﺴﯩﻢ ﻣﻪﺳــــﯩﻠﯩﻠﻪﺭﻧﻰ ﮬﻪﻝ ﻗﯩﻠﯩــــﺶ ﻳﯜﺯﯨــــﺴﯩﺪﯨﻦ‬ ‫ﺋﻮﺭﯗﻧﻼﺷــﺘﯘﺭﯗﻟﻐﺎﻥ. ﺑﻪﺯﯨــﺪﻩ ﺑﯩــﺰ ﻣــﯘﻗﯩﻢ، ﺋﯩﻤﻤﻮﻧﯩﺘﯧﺘﭽــﺎﻧﻠﯩﻘﻰ ﻛﯜﭼﻠــﯜﻙ)ﺋﺎﺳــﺎﻥ ﺋﯚﺯﮔﻪﺭﻣﻪﻳــﺪﯨﻐﺎﻥ(‬ ‫ﺑﻮﻟﻐﺎﻥ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﻧﻪﺗﯩﺠﯩﻠﯩﺮﯨﮕﻪ ﺋﯧﮫﺘﯩﻴﺎﺟﻠﯩﻖ ﺑﻮﻟﯘﭖ ﻗﺎﻟﺴﺎﻕ، ﻳﻪﻧﻪ ﺑﻪﺯﯨﺪﻩ ﺳﯜﺭﯛﺷـﺘﯜﺭﯛﻙ ﺧـﺎﺱ‬ ‫ﺳﯚﺯﻟﯩﺮﯨﻨﯩﯔ ﺋﻮﺭﻧﯩﻐﺎ ﻛﯚﭘﻤﺎﺱ ﻛﯧﯖﻪﻳﺘﻤﻪ ﻣﯧﺘﻮﺩﻻﺭﻧﻰ ﺋﯩﺸﻠﯩﺘﯩﭗ ﻗﯧﻠﯩﺸﯩﻤﯩﺰ ﻣﯘﻣﻜﯩﻦ...‬ ‫‪AsEnumerable‬‬ ‫‪ AsEnumerable‬ﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ:‬ ‫ (>‪public static IEnumerable AsEnumerable source‬‬ ‫‪ AsEnumerable‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﻣﻪﻧﺒﻪﻧﻰ ﺋﺎﺩﺩﻯ ﮬﺎﻟﺪﺍ >‪ IEnumerable‪ IEnumerable‪ IEnumerable‪ List‪public static T[] ToArray source‬‬ ‫ (>‪public static List ToList source‬‬ ‫ﺑﯘ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻼﺭﻧﯩﯔ ﻧﻪﺗﯩﺠﯩـﺴﻰ ﻣﻪﻧـﺒﻪ ﺗﯩﺰﻣﯩﻨﯩـﯔ ﺋﺎﻟﻤﺎﺷـﺘﯘﺭﯗﻟﻐﺎﻥ ﺋﻪﻣﻪﻟـﻰ ﻛﯚﭘﻪﻳﺘﻤﯩـﺴﻰ ﺑﻮﻟـﯘﭖ،‬ ‫ﺋﻪﮔﻪﺭ ﺋ ــﯘﻻﺭ ﺳﯜﺭﯛﺷـــﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨـــﺴﯩﻨﯩﯔ ﺋﯩﭽﯩـــﺪﻩ ﺋﯩـــﺸﻠﯩﺘﯩﻠﮕﻪﻧﺪﻩ ﻧﻪﺗﯩـــﺠﻪ ﻣﻪﻧـــﺒﻪ ﺗﯩﺰﻣﯩﻨﯩـــﯔ‬ ‫ـ‬ ‫ﺋﯚﺯﮔﯩﺮﯨﺸﯩﮕﻪ ﺋﻪﮔﯩﺸﯩﭗ ﺋﯚﺯﮔﻪﺭﻣﻪﻳﺪﯗ. ﺗﯚﯞﻩﻧﺪﻩ ‪ ToList‬ﻧﯩﯔ ﺋﯩﺸﻠﯩﺘﯩﺸﺘﯩﻦ ﺑﯩﺮ ﻣﯩﺴﺎﻝ:‬ ‫ﻛﻮﺩ 85.4‬ ‫ ;)‪List customersList = new List(customers‬‬ ‫ ‬ ‫ = ‪var expr‬‬ ‫ )(‪    from   c in customersList.ToList‬‬ ‫ ‪    where  c.Country == Countries.Italy‬‬ ‫ ;‪    select c‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫78‬ ‫ ‬ ‫ { )‪foreach (var item in expr‬‬ ‫ ;)‪    Console.WriteLine(item‬‬ ‫ }‬ ‫ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﯩﻨﯩﯔ ﻧﻪﺗﯩﺠﯩﺴﯩﻨﻰ ﻗﺎﻳﺘﺎ- ﻗﺎﻳﺘﺎ ﭼﺎﺭﻻﺷﻘﺎ ﺗـﻮﻏﺮﺍ ﻛﻪﻟﮕﻪﻧـﺪﻩ ﺑـﯘ ﻣﻪﺷـﻐﯘﻻﺗﭽﯩﻼﺭ‬ ‫ﻧﺎﮬﺎﻳﯩﺘﻰ ﺋﻪﺱ ﻗﺎﺗﯩﺪﯗ. ﭼﯜﻧﻜﻰ ﻧﻮﺭﻣﺎﻝ ﮬﺎﻟﻪﺗﺘﻪ، ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙـﺎﺩﻩ ﻧﻪﺗﯩﺠﯩـﺴﯩﻨﻰ ﮬﻪﺭﺑﯩـﺮ ﻗﯧـﺘﯩﻢ‬ ‫ﭼ ـﺎﺭﻻﺵ ﺋﯩﭙﺎﺩﯨﻨﯩ ـﯔ ﺑﯩ ـﺮ ﻗﯧ ـﺘﯩﻢ ﺋﯩﺠ ـﺮﺍ ﺑﻮﻟﯘﺷ ـﯩﻨﻰ ﻛﻪﻟﺘ ـﯜﺭﯛﭖ ﭼﯩﻘﯩﺮﯨ ـﺪﯗ. ﺋﻪﮔﻪﺭ ﺋﯩﭙ ـﺎﺩﻩ ﺳ ـﺎﻧﺪﺍﻧﻐﺎ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻣﻪﺷــﻐﯘﻻﺕ ﺋﯧﻠﯩــﭗ ﺑﯧﺮﯨﯟﺍﺗﻘــﺎﻥ ﺑﻮﻟــﺴﺎ، ﺋﯧﻨﯩﻘﻜــﻰ ﺋﯜﻧﯜﻣــﺪﯨﻦ ﺋﯘﺗﺘــﯘﺭﯗﭖ ﻗــﻮﻳﯩﻤﯩﺰ. ﺷــﯘﯕﺎ ﺑﯘﻧــﺪﺍﻕ‬ ‫ﺋﻪﮬﯟﺍﻟﻼﺭﺩﺍ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﻩ ﻧﻪﺗﯩﺠﯩﺴﯩﻨﻰ ‪ ToList‬ﻳﺎﻛﻰ ‪ ToArray‬ﺋﺎﺭﻗﯩﻠﯩﻖ ﺋﻪﺯﺍﻻﺭﻧﯩﯔ ﺋﻪﻣﻪﻟﯩـﻲ‬ ‫ﺗﻮﭘﻠﯩﺮﯨﻐﺎ ﺋﺎﻳﻼﻧﺪﯗﺭﯨﯟﯦﻠﯩﭗ ﺋﺎﻧﺪﯨﻦ ﻣﻪﺷﻐﯘﻻﺕ ﺋﯧﻠﯩﭗ ﺑﺎﺭﻏﺎﻥ ﺗﯜﺯﯛﻙ.‬ ‫ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻣﯩﺴﺎﻟﺪﺍ ‪ ToList‬ﺋـﺎﺭﻗﯩﻠﯩﻖ ﻣﻪﮬـﺴﯘﻻﺗﻼﺭﻏﺎ ﺋﯧﻠﯩـﭗ ﺑﯧﺮﯨﻠﻐـﺎﻥ ﺳﯜﺭﯛﺷـﺘﯜﺭﯛﻙ ﻧﻪﺗﯩﺠﯩـﺴﯩﻨﻰ‬ ‫ﻛﯚﭼﯜﺭﯛﯞﺍﻟﯩﺪﯗ:‬ ‫ﻛﻮﺩ 95.4‬ ‫ = ‪var productsQuery‬‬ ‫ ‪    (from p in products‬‬ ‫ 03 => ‪     where p.Price‬‬ ‫ )‪     select p‬‬ ‫ ;)(‪    .ToList‬‬ ‫ ‬ ‫ = ‪var ordersWithProducts‬‬ ‫ ‪    from c in customers‬‬ ‫ ‪        from   o in c.Orders‬‬ ‫ ‪        join   p in productsQuery‬‬ ‫ ‪               on o.IdProduct equals p.IdProduct‬‬ ‫ ,‪        select new { p.IdProduct, o.Quantity, p.Price‬‬ ‫ ;}‪                     TotalAmount = o.Quantity * p.Price‬‬ ‫ ‬ ‫ { )‪foreach (var order in ordersWithProducts‬‬ ‫ ;)‪    Console.WriteLine(order‬‬ ‫ }‬ ‫ﺋﻪﻣ ــــﺪﻯ ‪ ordersWithProducts‬ﺋﯩﭙ ــــﺎﺩﻩ ﻧﻪﺗﯩﺠﯩ ــــﺴﯩﻨﻰ ﭼﺎﺭﻟﯩﻐﺎﻧ ــــﺪﺍ، ‪ foreach‬ﺑﯚﻟﯩﻜﯩ ــــﺪﯨﻜﻰ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫‪ productsQuery‬ﻗﺎﻳﺘﺎ- ﻗﺎﻳﺘﺎ ﺋﯩﺠﺮﺍ ﺑﻮﻟﻤﺎﻳﺪﯨﻐﺎﻥ ﺑﻮﻟﺪﻯ.)ﺑﯘﻻﺭ ﺑﯘﺭﯗﻧﻘﻰ ﻣﻪﺯﻣﯘﻧﻼﺭﻧﯩﯔ ﻣﯩﺴﺎﻟﯩﺪﯨﻜﻰ‬ ‫ﺋﯩﭙﺎﺩﯨﻠﻪﺭﻧﯩﯔ ﺋﯩﺴﯩﻤﻠﯩﺮﻯ(‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫88‬ ‫‪ToDictionary‬‬ ‫‪ ToDictionary‬ﺑﻮﻟــــﺴﺎ >‪ Dictionary‪public static Dictionary ToDictionary source‬‬ ‫ ;)‪    Func keySelector‬‬ ‫ (>‪public static Dictionary ToDictionary source‬‬ ‫ ,‪    Func keySelector‬‬ ‫ ;)‪    IEqualityComparer comparer‬‬ ‫ (>‪public static Dictionary ToDictionary source‬‬ ‫ ,‪    Func keySelector‬‬ ‫ ;)‪    Func elementSelector‬‬ ‫ (>‪public static Dictionary ToDictionary source‬‬ ‫ ,‪    Func keySelector‬‬ ‫ ,‪    Func elementSelector‬‬ ‫ ;)‪    IEqualityComparer comparer‬‬ ‫ﮬﻪﻣﯩﻤﯩــﺰﮔﻪ ﺋﺎﻳــﺎﻥ، >‪ Dictionary‪Dictionary.Default‬ﻧ ــﻰ‬ ‫ـ‬ ‫ﺋﯩﺸﻠﯩﺘﯩﺪﯗ.‬ ‫ﻛﻮﺩ 06.4 ﺩﺍ ﺑﯩﺰ ‪ ToDictionary‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﻰ ﺋﯩﺸﻠﯩﺘﯩﭗ، ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﯩﯔ ‪ dictionary‬ﺳـﯩﻨﻰ‬ ‫ﻗﯘﺭﺩﯗﻕ. )ﺑﯘ ﻳﻪﺭﺩﯨﻜﻰ ‪ dictionary‬ﻟﯘﻏﻪﺕ ﺩﯦﮕﻪﻥ ﻣﻪﻧﯩﺴﻰ ﺑﺎﺭ. ﺑﯘﻧـﺪﺍﻕ ﺋﺎﺗﺎﺷـﺘﯩﻜﻰ ﺳـﻪﯞﻩﺑﻤﯘ ﮬﻪﻡ‬ ‫ﻟﯘﻏﻪﺗﺘﯩﻜﻰ ﮬﻪﺭﺑﯩﺮ ﺋﺎﭼﻘﯘﭼﻠﯘﻕ ﺳﯚﺯﻧﯩﯔ ﺑﯩﺮﺩﯨﻦ- ﺑﯩﺮ ﺑﻮﻟﻐﺎﻧﻠﯩﻘﯩﺪﺍ(‬ ‫ﻛﻮﺩ 06.4‬ ‫ = ‪var customersDictionary‬‬ ‫ ‪    customers‬‬ ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫98‬ ‫ ,‪    .ToDictionary(c => c.Name‬‬ ‫ ;)}‪                  c => new {c.Name, c.City‬‬ ‫ﻳــﯘﻗﯩﺮﯨﻘﻰ ﻣﯩــﺴﺎﻟﺪﺍ، ﻣﻪﺷــﻐﯘﻻﺗﭽﯩﻨﯩﯔ ﺑﯩﺮﯨﻨﭽــﻰ ﭘــﺎﺭﺍﻣﯧﺘﯩﺮﻯ )‪ (c=?c.Name‬ﺑﻮﻟــﺴﺎ ‪keySelector‬‬ ‫ﻛﯚﺭﺳﻪﺗﻤﯩ ـﺴﻰ ﺑﻮﻟ ـﯘﭖ، ﺋ ـﯘ »ﻧﻪﺗﯩ ـﺠﻪ ﻟﯘﻏﯩﺘﯩ ـﺪﯨﻜﻰ ﮬﻪﺭ ﺑﯩ ـﺮ ﺋﯧﻠﯧﻤﯧﻨ ـﺖ ﺋﯜﭼ ـﯜﻥ ﺧﯧﺮﯨ ـﺪﺍﺭﻧﯩﯔ ﻧ ـﺎﻡ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﺧﺎﺳﻠﯩﻘﯩﻨﻰ ﺋـﺎﭼﻘﯘﭺ ﺳـﯚﺯ ﻗﯩﻠﯩـﭗ ﺑﯧﻜﯩـﺖ« ﺩﯦﮕﻪﻧﻨـﻰ ﻛﯚﺭﺳـﯩﺘﯩﭗ ﺑﯧﺮﯨـﺪﯗ. ﺋﯩﻜﻜﯩﻨﭽـﻰ ﭘـﺎﺭﺍﻣﯧﺘﯩﺮﻯ‬ ‫‪ elementSelector‬ﺑﻮﻟﯘﭖ، ﺋﯘ ﺧﯧﺮﯨﺪﺍﺭﻧﯩﯔ ﻧﺎﻣﻰ ﺑﯩـﻠﻪﻥ ﺷـﻪﮬﻪﺭ ﺧﺎﺳـﻠﯩﻘﯩﻨﯩﻼ ﺋـﯚﺯ ﺋﯩﭽﯩـﮕﻪ ﺋﺎﻟﻐـﺎﻥ‬ ‫ﻧﺎﻣــﺴﯩﺰ ﺗﯩﭙﻠﯩــﻖ ﺋــﻮﺑﻴﯧﻜﺘﻨﻰ ﻟــﯘﻏﻪﺗﺘﯩﻜﻰ ﮬﻪﺭ ﺑﯩــﺮ ﺋﯧﻠﯧﻤﯧﻨﺘﻨﯩــﯔ ﻗﯩﻤــﻤﻪﺕ ﺑــﯚﻟﯩﻜﻰ )‪ (K‬ﻗﯩﻠﯩــﭗ‬ ‫ﺑﻪﻟﮕﯩﻠﻪﺷــﻨﻰ ﻛﯚﺭﺳــﯩﺘﯩﺪﯗ. ﺗﯚﯞﻩﻧﺪﯨﻜﯩــﺴﻰ ﻛــﻮﺩ 06.4 ﺩﯨﻜــﻰ ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻛﻨﯩﯔ ﻧﻪﺗﯩﺠﯩــﺴﯩﻨﯩﯔ‬ ‫ﻣﻪﺯﻣﯘﻧﻰ:‬ ‫‪K‬‬ ‫‪E‬‬ ‫]}‪[Paolo, {Name=Paolo, City=Brescia‬‬ ‫]}‪[Marco, {Name=Marco, City=Torino‬‬ ‫]}‪[James, {Name=James, City=Dallas‬‬ ‫]}‪[Frank, {Name=Frank, City=Seattle‬‬ ‫ﺋﻪﺳــﻜﻪﺭﺗﯩﺶ: ﺧــﯘﺩﺩﻯ ‪ ToList,ToArray‬ﻻﺭﻏــﺎ ﺋﻮﺧــﺸﺎ، ‪ ToDictionary‬ﺋــﺎﺭﻗﯩﻠﯩﻖ ﺋﯧﺮﯨــﺸﻜﻪﻥ‬ ‫ﻧﻪﺗﯩﺠﯩﻤﯘ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﺠﺮﺍ ﻧﻪﺗﯩﺠﯩﺴﯩﻨﯩﯔ ﺋﻪﻣﻪﻟﯩﻲ ﻛﯚﭘﻪﻳﺘﯩﻠﻤﯩﺴﯩﺪﯨﻦ ﺋﯩﺒﺎﺭﻩﺕ.‬ ‫‪ToLookup‬‬ ‫‪ ToLookup‬ﻣﻪﺷﻐﯘﻻﺗﭽﯩــﺴﻰ ﻣﻪﻧــﺒﻪ ﺗﯩﺰﻣﯩــﺪﯨﻦ >‪ Lookup‪ Lookup>‪public class Lookup : IEnumerable this[K key] { get‬‬ ‫ ;)‪    public bool Contains(K key‬‬ ‫ ;)(‪    public IEnumerator> GetEnumerator‬‬ ‫}‬ ‫>‪ Lookup‪public static Lookup ToLookup source‬‬ ‫ ;)‪    Func keySelector‬‬ ‫ (>‪public static Lookup ToLookup source,      Func keySelector,      IEqualityComparer comparer);  public static Lookup ToLookup(      this IEnumerable source,      Func keySelector,      Func elementSelector);  public static Lookup ToLookup(      this IEnumerable source,      Func keySelector,      Func elementSelector,      IEqualityComparer comparer); elementSelector ،‫ ﻛﯚﺭﺳﻪﺗﻜﯜﭼﯩـﺴﻰ‬keySelector ‫ ﺩﯨﻜﯩﮕﻪ ﺋﻮﺧﺸﺎﺵ، ﺑﯘﻧﯩﯖـﺪﯨﻤﯘ‬ToDictionary .‫ ﺳﯧﻠﯩﺸﺘﯘﺭﻏﯘﭼﯩﻠﯩﺮﻯ ﺑﺎﺭ‬comparer ‫ﻛﯚﺭﺳﻪﺗﻜﯜﭼﯩﺴﻰ ﯞﻩ‬ ‫ﻛ ـﻮﺩ 16.4 ﺩﯨﻜ ـﻰ ﻣﯩ ـﺴﺎﻟﺪﺍ ﻣﻪﺯﻛ ـﯘﺭ ﻣﻪﺷ ـﻐﯘﻻﺗﭽﯩﻨﻰ ﺋﯩ ـﺸﻠﯩﺘﯩﭗ ﺗ ـﯘﺭﯗﭖ ﮬﻪﺭﺑﯩ ـﺮ ﻣﻪﮬ ـﺴﯘﻻﺗﻘﺎ ﻗﺎﺭﺗ ـﺎ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ :‫ﺯﺍﻛﺎﺯﻻﺭﻏﺎ ﻗﺎﻧﺪﺍﻕ ﺋﯧﺮﯨﺸﯩﺶ ﺋﯘﺳﯘﻟﻰ ﻛﯚﺭﺳﯩﺘﯩﻠﯩﺪﯗ‬ 4.61 ‫ﻛﻮﺩ‬ var ordersByProduct =      (from c in customers           from   o in c.Orders           select o)      .ToLookup(o => o.IdProduct);    Console.WriteLine( "\n\nNumber of orders for Product 1: {0}\n",                     ordersByProduct[1].Count());    foreach (var product in ordersByProduct) {      Console.WriteLine("Product: {0}", product.Key);      foreach(var order in product) {          Console.WriteLine("  {0}", order);  :‫ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺴﻰ ﻳﯘﻗﯩﺮﯨﻘﻰ ﻛﻮﺩﻧﯩﯔ ﺋﯩﺠﺮﺍ ﻧﻪﺗﯩﺠﯩﺴﻰ‬ Product: 1 3 - False - January – 1 10 - False - July – 1 Product: 2 5 - True - May – 2 ‫‪www.udmish.cn‬‬ ‫‪ LINQ‬ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ‬ ‫19‬ ‫3 :‪Product‬‬ ‫3 – ‪20 - True - December‬‬ ‫3 – ‪20 - True - December‬‬ ‫5 :‪Product‬‬ ‫5 - ‪20 - False - July‬‬ ‫‪ OfType‬ﺑﯩﻠﻪﻥ ‪Cast‬‬ ‫‪ OfType‬ﺑﯩ ــﻠﻪﻥ ‪ Cast‬ﺋﺎﻟﻤﺎﺷ ــﺘﯘﺭﯗﺵ ﻣﻪﺷ ــﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺋﯩﭽﯩ ــﺪﯨﻜﻰ ﺋﻪﯓ ﺋ ــﺎﺧﯩﺮﯨﻘﻰ ﺋﯩﻜﻜﯩ ــﺴﻰ.‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫‪ OfType‬ﻣﻪﻧﺒﻪﺩﯨﻜـــﻰ ﺋﻪﺯﺍﻻﺭﻧـــﻰ ﭼـــﺎﺭﻻﭖ ﭘﻪﻗﻪﺕ ﺗﯩﭙـــﻰ ‪ T‬ﺑﻮﻟﻐـــﺎﻧﻨﯩﻼ ﻳﯩﻐﯩﯟﺍﻟﯩـــﺪﯗ)ﺷـــﯘﻧﯩﯖﺪﯨﻦ‬ ‫ﻛﯚﺭﯨﯟﯦﻠﯩﺸﻘﺎ ﺑﻮﻟﯩﺪﯗ، ﺑﯩﺮ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭ ﺋﻮﺧﺸﯩﻤﯩﻐﺎﻥ ﺗﯩﭙﻠﯩـﻖ ﺑﻮﻟﯘﺷـﯩﻤﯘ ﻣـﯘﻣﻜﯩﻦ(. ﻣﻪﺳـﯩﻠﻪﻥ:‬ ‫ﺋﻮﺑﻴﯧﻜﺘﻘﺎ ﻳﯜﺯﻟﻪﻧﮕﻪﻥ ﭘﺮﻭﮔﺮﺍﻣﻤﺎ ﻻﻳﯩﮫﻪﻟﻪﺵ ﭘﯩﺮﯨﻨـﺴﯩﭙﻰ ﺑـﻮﻳﯩﭽﻪ، ﻣﻪﻧـﺒﻪ ﺗﯩﺰﻣﯩـﺪﺍ ﺑﻪﻟﻜﯩـﻢ ﺋﻮﺧـﺸﺎﺵ‬ ‫ﺋﺎﺗﯩ ـﺪﯨﻦ ﺑﻮﻟﻐ ـﺎﻥ ﺋﻮﺧ ـﺸﯩﻤﯩﻐﺎﻥ ﺗﯩﭙﻠﯩ ـﻖ ﺋﻪﺯﺍﻻﺭ ﺑﻮﻟﯘﺷ ـﻰ ﻣ ـﯘﻣﻜﯩﻦ)ﺋﻮﺧ ـﺸﺎﺵ ﺑﯩ ـﺮ ﺗﯩﭙﻘ ـﺎ ﯞﺍﺭﯨ ـﺴﻠﯩﻖ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ـ‬ ‫ﻗﯩﻠﻐﺎﻥ(. ﮔﻪﺭﭼﻪ ﺋﯘﻻﺭﻧﯩﯔ ﮬﻪﻣﻤﯩﺴﻰ ﺋﺎﺗﯩﺴﯩﻨﯩﯔ ﺋﯩﻘﺘﯩﺪﺍﺭﻯ ﺑﻮﻟـﺴﯩﻤﯘ ﻟـﯧﻜﯩﻦ ﻳﻪﻧﯩـﻼ ﺑﺎﺷـﻘﺎ- ﺑﺎﺷـﻘﺎ‬ ‫ﺗﯩﭗ.‬ ‫ (>‪public static IEnumerable OfType‪public static IEnumerable Cast‪ IEnumerrable
Related docs
LINQ in Action
Views: 2  |  Downloads: 0
Introducing Microsoft Office 2007©
Views: 41  |  Downloads: 10
Introducing eSafe Content Security
Views: 0  |  Downloads: 0
Tutorial Introducing
Views: 492  |  Downloads: 37
Introducing FrontPage
Views: 9  |  Downloads: 1
Microsoft Silverlight
Views: 1  |  Downloads: 0
ntroducing Microsoft Silverlight
Views: 0  |  Downloads: 0
Introducing the ASP
Views: 2  |  Downloads: 0
Introducing Linux
Views: 5  |  Downloads: 0
INTRODUCING
Views: 134  |  Downloads: 0
Introducing C_
Views: 44  |  Downloads: 0
Introducing and Integrating
Views: 24  |  Downloads: 0