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
5namespace 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
;"ﻛﯩﺮﺩﯨﻢ ﻳﺎﺷﻘﺎ.............ﻣﻪﻥ" = 1string 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
2cﻧﯩﯔ ﻳﯘﻗﯩﺮﯨﻘﻰ ﺋﯧﻨﯩﻘﻠﯩﻤﯩﺴﻰ ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ ﺗﯚﯞﻩﻧﻜﻰ ﺋﯩﻜﻜﻰ ﺟﯜﻣﻠﻪ ﺑﯩﻠﻪﻥ ﺑﺎﺭﺍﯞﻩﺭ
;) 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 ListList 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 ;) 0public delegate T Func< A0, T >( A0 arg ;) 1public delegate T Func< A0, A1, T > ( A0 arg0, A1 arg public <delegate Func T ,0A ,1A 2A2, >( arg0, arg1, arg 0T A 1A 2A ;) ,2public delegate T Func< A0, A1, A3, T > ( A0 arg0, A1 arg1, A2 arg ;) 3A3 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ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﺋﯘﻧﯩﯔ ﺗﯩﭙﯩﻚ ﻣﯩــﺴﺎﻟﻰ. ﺑﯘﻧــﺪﺍﻕ ﺩﯦﻴﯩــﺸﯩﻤﯩﺰﺩﯨﻜﻰ ﺳــﻪﯞﻩﺏ ﺋــﯘ ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻙ ﻧﻪﺗﯩﺠﯩــﺴﯩﻨﻰ >IEnumerablepublic 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 IEnumerablepublic 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.Emptypublic 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 EqualityComparerpublic 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ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﭼﯩﻘﯩﺮﯨﺪﯗ// >IEnumerableemptyProducts 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ﺋﺎﺭﻗﯩﻠﯩﻖ > IEnumerablepublic 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