Professional Documents
Culture Documents
ﻋﻠﻲ ﺍﻗﺪﻡ ﺍﺯ ﺍﺑﺘﺪﺍ ﻱ ﺁﺷﻨﺎﻳﻲ ﺧﻮﺩ ﺑﺎ ﮐﺎﻣﭙﻴﻮﺗﺮ ﻋﻼﻗﻪ ﻱ ﻋﺠﻴﺒﻲ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻭ ﻃﺮﺍﺣﻲ
ﺣﺲ ﮐﺮﺩ ﻭ ﺗﻤﺎﻡ ﺗﻼﺵ ﺧﻮﺩ ﺭﺍ ﺩﺭ ﺍﻳﻦ ﺯﻣﻴﻨﻪ ﻫﺎ ﺍﻧﺠﺎﻡ ﺩﺍﺩ ،ﺩﺭ ﺳﺎﻝ 88ﺑﻪ ﺩﻧﻴﺎﻱ .NET
ﻭﺍﺭﺩ ﺷﺪ ﻭ ﺳﻌﻲ ﮐﺮﺩ ﺗﺎ ﻣﻔﺎﻫﻴﻢ ﻣﺮﺑﻮﻁ ﺑﻪ ﺍﻳﻦ ﭘﻠﺘﻔﺮﻡ ﺭﺍ ﻓﺮﺍ ﺑﮕﻴﺮﺩ.
ﺍﻭ ﻫﻢ ﺍﮐﻨﻮﻥ ﺩﺭ ﺣﺎﻝ ﺗﺤﺼﻴﻞ ﺩﺭ ﺭﺷﺘﻪ ﻣﻬﻨﺪﺳﻲ ﻧﺮﻡ ﺍﻓﺰﺍﺭ ﻭ ﺩﺭ ﺣﺎﻝ ﺁﻣﺎﺩﻩ ﺷﺪﻥ ﺑﺮﺍﻱ
ﺁﺯﻣﻮﻥ ﻫﺎﻱ MCTSﺍﺳﺖ .ﺍﻳﻦ ﺍﺛﺮ ﺣﺎﺻﻞ ﻣﻄﺎﻟﻌﺎﺕ ﺍﻭ ﺩﺭ ﺯﻣﻴﻨﻪ LINQﺍﺳﺖ ﻭ ﺍﺯ ﺁﻧﺠﺎﻱ
ﮐﻪ ﻫﻴﭻ ﺍﺛﺮﻱ ﺑﺪﻭﻥ ﺍﺷﻐﺎﻝ ﻧﻤﻲ ﺑﺎﺷﺪ ،ﺧﻮﺷﺤﺎﻝ ﺧﻮﺍﻫﺶ ﺷﺪ ﮐﻪ ﺍﺷﮑﺎﻻﺕ ﻭ ﭘﻴﺸﻨﻬﺎﺩﺍﺕ ﺧﻮﺩ ﺭﺍ ﺑﺎ ﺍﻭ ﺩﺭ ﻣﻴﺎﻥ ﺑﮕﺬﺍﺭﻳﺪ.
ﺑﺮﺍﻱ ﺁﺷﻨﺎﻳﻲ ﺑﻴﺸﺘﺮ ﺑﺎ ﺍﻭ ﻧﻮﺷﺘﻪ ﻫﺎﻱ ﺍﻭ ﻣﻲ ﺗﻮﺍﻥ ﺑﻪ ﻭﺑﻼﮒ ﺍﻭ ﻣﺮﺍﺟﻌﻪ ﮐﻨﻴﺪ ،ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺗﻮﺍﻧﻴﺪ ﺑﺎ ﺭﺍﻳﺎﻧﺎﻣﻪ ﻫﺎﻱ ﺯﻳﺮ ﺑﺎ ﺍﻭ
ﺍﺭﺗﺒﺎﻁ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ.
www.aliaghdam.ir
U U
info@aliaghdam.ir
U U
alitopack@gmail.com
U U
ﻓﻬﺮﺳﺖ ﻣﻄﺎﻟﺐ
........................................................................................................................................................................................................
1 ﻣﻘﺪﻣﻪ ﻓﺼﻞ
LINQﭼﻴﺴﺖ؟ ..................................................................................................................................................................................................
2
10
ﺗﻌﺮﻳﻒ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ .....................................................................................................................................................................................
10
ﻓﺮﺍﺧﻮﺍﻧﻲ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺩﺭ ﺳﻄﺢ ﻧﻤﻮﻧﻪ ﺍﻱ ...................................................................................................................................................
11
ﻓﺮﺍﺧﻮﺍﻧﻲ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺩﺭ ﺳﻄﺢ ﺍﻳﺴﺘﺎ .........................................................................................................................................................
12
ﺗﻮﺳﻌﻪ ﺭﺍﺑﻂ ﻫﺎ ﺑﻮﺳﻴﻠﻪ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ .............................................................................................................................................................
14
ﺗﻌﺮﻳﻒ ﻋﺒﺎﺭﺍﺕ ﻻﻣﺒﺪﺍ .................................................................................................................................................................................
21
..................................................................................................................................................................................................... ﻣﻘﺪﻣﻪ ﻓﺼﻞ
21
............................................................................................................................................................ . ﺍﻧﻮﺍﻉ ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭﺟﻮ
37......................................................................................................................................................................................Thenby ﻋﻤﻠﮕﺮ
38............................................................................................................................................................ThenByDecending ﻋﻤﻠﮕﺮ
39....................................................................................................................................................................................Reverse ﻋﻤﻠﮕﺮ
45................................................................................................................................................................................Aggregate ﻋﻤﻠﮕﺮ
1 ﺍﻣﺮﻭﺯﻩ ﺑﺎ ﻭﺟﻮﺩ ﺯﺑﺎﻥ ﻫﺎﻱ ﺷﻲ ﮔﺮﺍ ﮐﻪ ﻗﺎﺑﻠﻴﺖ ﻫﺎﻱ ﺭﺍ ﺩﺭ ﺍﺧﺘﻴﺎﺭ ﺗﻮﺳﻌﻪ ﺩﻫﻨﺪﮔﺎﻥ ﻗﺮﺍﺭ ﻣﻲ ﺩﻫﺪ ،ﺭﻭﺵ ﻫﺎﻱ
ﻣﺨﺘﻠﻔﻲ ﺑﺮﺍﻱ ﺍﺭﺗﺒﺎﻁ ﺑﺎ ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﻫﺎﻱ ﺭﺍﺑﻄﻪ ﺍﻱ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﮐﻪ ﻓﻘﺪﺍﻥ ﺭﻭﺷﻲ ﻣﺸﺨﺺ ﻭ ﺁﺳﺎﻥ ﺑﺮﺍﻱ ﺍﺗﺼﺎﻝ
ﺑﻪ ﺍﻧﻮﺍﻉ ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﻫﺎﻱ ﺭﺍﺑﻄﻪ ﺍﻱ ﻭ ﺑﻪ ﺻﻮﺭﺕ ﮐﻠﻲ ﺑﻪ ﻫﺮ ﻧﻮﻉ ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﺍﻱ ﮐﻪ ﺑﻪ ﺻﻮﺭﺕ ﺷﺊ ﻧﻴﺴﺖ،
ﺍﺣﺴﺎﺱ ﻣﻲ ﺷﻮﺩ.
ﺷﺎﻳﺪ ﺷﻤﺎ ﺑﮕﻮﻳﻴﺪ ﮐﻪ ADO.NETﻣﻲ ﺗﻮﺍﻧﺪ ﺑﺎ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﻣﻔﻬﻮﻡ DataSetﺑﻪ ﺍﻳﻦ ﺁﺭﻣﺎﻥ ﺩﺳﺖ ﻳﺎﻓﺖ ﺍﻣﺎ ﺑﺮﺍﻱ ﺗﺤﻘﻖ ﺁﻥ
ﻣﻲ ﺑﺎﻳﺴﺖ ﺍﺯ ﻳﮏ ﺷﻲ DataAdapterﺍﺳﺘﻔﺎﺩﻩ ﮎﺭﺩ .ﻳﮏ ﺷﻲ DataAdapterﭼﻬﺎﺭ ﺷﻲ Commandﺭﺍ ﺩﺭ ﺧﻮﺩ ﭘﻴﺎﺩﻩ
ﺳﺎﺯﻱ ﻣﻲ ﮐﻨﺪ ﮐﻪ ﺍﻳﻦ ﺍﺷﻲﺍﺀ ﺑﺮﺍﻱ ﺍﻧﺠﺎﻡ ﻋﻤﻠﻴﺎﺕ Update ¡ Delete ¡ Selectﻭ Insertﺑﺮ ﺭﻭﻱ ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﻣﻮﺭﺩ
SQL ﺍﺳﺘﻔﺎﺩﻩ ﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﻧﺪ ﻭﻟﻲ ﺗﻮﺟﻪ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ﮐﻪ ﺑﺮﺍﻱ ﺍﻧﺠﺎﻡ ﺍﻳﻦ ﻋﻤﻞ ﺷﻤﺎ ﻣﻲ ﺑﺎﻳﺴﺖ ﺍﻳﻦ ﺍﺷﻴﺎﺀ ﺭﺍ ﺑﺎ ﻋﺒﺎﺭﺕ
SQL ﻣﻨﺎﺳﺐ ﺧﻮﺩ ﻣﻘﺪﺍﺭ ﺩﻫﻲ ﮐﻨﻴﺪ ﻭ ﮐﻪ ﺑﺮﺍﻱ ﺑﺎ ﺍﻧﺠﺎﻡ ﺍﻳﻦ ﻋﻤﻞ ﺗﺎ ﻫﻨﮕﺎﻡ ﺍﺟﺮﺍﻱ ﺑﺮﻧﺎﻣﻪ ﻧﻤﻲ ﺗﻮﺍﻧﻴﻢ ﺍﺯ ﺻﺤﺖ ﻋﺒﺎﺭﺕ
ﺧﻮﺩ ﺍﻃﻤﻴﻨﺎﻥ ﮐﺴﺐ ﮐﻨﻴﺪ .ﺍﻳﻦ ﺑﺪﺍﻥ ﻣﻌﻨﺎﺳﺖ ﮐﻪ ﻋﺒﺎﺭﺍﺕ SQLﺩﺭ ﺯﺑﺎﻥ ﻫﺎﻱ ﺩﺍﺕ ﻧﺖ ﺑﻴﮕﺎﻧﻪ ﻫﺴﺘﻨﺪ ﻭ ﻋﺒﺎﺭﺕ SQLﻣﻘﺪﺍﺭ
ﺩﻫﻲ ﺷﺪﻩ ﺑﺮﺍﻱ ﺩﺍﺕ ﻧﺖ ﻭ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺩﺭ ﺗﺎﺭﻳﮑﻲ ﺍﺳﺖ ! ﻭ ﺗﺎ ﺍﺟﺮﺍ ﻧﺸﺪﻥ ﻋﺒﺎﺭﺕ SQLﺍﺯ ﺻﺤﺖ ﻋﺒﺎﺭﺕ ﻫﻴﭻ ﺍﻃﻼﻋﻲ
ﻧﺪﺍﺭﻳﻢ.
|ﺻﻔﺤﻪ2 LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
LINQﭼﻴﺴﺖ؟
ﺩﺭ ﮐﻨﻔﺮﺍﻧﺲ ﺗﻮﺳﻌﻪ ﺩﻫﻨﺪﮔﺎﻥ ﺣﺮﻓﻪ ﺍﻱ ﻣﺎﻳﮑﺮﻭﺳﺎﻓﺖ ϭﺩﺭ ﺳﺎﻝ ، 2005ﺁﻗﺎﻱ ﻫﻠﺴﺒﺮﮒ Ϯﻳﮏ ﺗﮑﻨﻮﻟﻮﮊﻱ ﺟﺪﻳﺪ ﮐﻪ
ﺑﺘﻮﺍﻥ ﺑﻪ ﻭﺳﻴﻠﻪ ﺁﻥ ﺑﺎ ﻫﺮ ﻧﻮﻉ ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﺍﻱ ﺑﻪ ﻳﮏ ﺭﻭﺵ ﻳﮑﺴﺎﻥ ﺍﺗﺼﺎﻝ ﺑﺮﻗﺮﺍﺭ ﮐﺮﺩ ،ﺑﻪ ﻧﺎﻡ LINQﻣﻌﺮﻓﻲ ﻧﻤﻮﺩ.
LINQﻣﺨﻔﻒ ﻋﺒﺎﺭﺕ Language-Integrated Queryﺍﺳﺖ ﺗﻮﺟﻪ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ﮐﻪ ﺁﻥ ﺭﺍ ﻟﻴﻨﮏ ) (Linkﺗﻠﻔﻆ ﮐﻨﻴﺪ.
LINQﻳﮏ ﺭﺍﻩ ﺣﻞ ﻳﮑﺴﺎﻥ ﺑﺮﺍﻱ ﺍﺗﺼﺎﻝ ﺑﺮﻗﺮﺍﺭ ﮐﺮﺩﻥ ﻭ ﺑﺎﺯﻳﺎﺑﻲ ﺍﻃﻼﻋﺎﺕ ﺍﺯ ﻫﺮ ﺷﻲ ﮐﻪ ﺭﺍﺑﻂ IEnumerableﺭﺍ ﭘﻴﺎﺩﻩ
ﺳﺎﺯﻱ ﮐﺮﺩﻩ ﺑﺎﺷﺪ ﻓﺮﺍﻫﻢ ﻣﻴﮑﻨﺪ .ﺑﻮﺳﻴﻠﻪ LINQﻣﻲ ﺗﻮﺍﻥ ﺑﺎ ﺁﺭﺍﻳﻪ ﻫﺎ ﻭﻣﺠﻤﻮﻋﻪ ﻫﺎﻱ ϯﺩﺭﻭﻥ ﺣﺎﻓﻈﻪ ،ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﻫﺎﻱ
ﺭﺍﺑﻄﻪ ﺍﻱ ﻭ ﺣﺘﻲ ﺍﺳﻨﺎﺩ XMLﺭﺍ ﺑﻪ ﻋﻨﻮﺍﻥ ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺖ ﻭ ﺑﺎ ﺁﻥ ﮐﺎﺭ ﮐﺮﺩ!
ﺑﻮﺳﻴﻠﻪ LINQﻣﻲ ﺗﻮﺍﻥ ﺍﻃﻼﻋﺎﺕ ﺭﺍ ﺍﺯ ﻫﺮ ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﺍﻱ ﺑﺎ ﮔﺮﺍﻣﺮﻱ ﻣﺸﺎﺑﻪ ﻭ ﺧﻮﺵ ﺷﮑﻞ ﺑﺎﺯﻳﺎﺑﻲ ﮐﺮﺩ.ﮔﺮﺍﻣﺮﻱ ﮐﻪ
ﺑﺴﻴﺎﺭ ﺷﺒﻴﻪ ﺑﻪ ﻧﻮﺷﺘﺎﺭ ﻧﺤﻮﻱ SQLﺍﺳﺖ ،ﺗﻮﺟﻪ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ﮐﻪ ﻫﺪﻑ ﺗﻴﻢ ﺳﺎﺯﻧﺪﻩ ،LINQﺍﺿﺎﻓﻪ ﮐﺮﺩﻥ ﻳﮏ ﺭﺍﻩ ﺟﺪﻳﺪ ﺑﺮﺍﻱ
ﺑﺎﺯﻳﺎﺑﻲ ﺩﺍﺩﻫﺎ ﻧﻴﺴﺖ ،ﺑﻠﮑﻪ ﻓﺮﺍﻫﻢ ﮐﺮﺩﻥ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺩﺳﺘﻮﺭﺍﺕ ﻣﺤﻠﻲ ﻭ ﺟﺎﻣﻊ ﺑﺮﺍﻱ ﺑﺎﺯﻳﺎﺑﻲ ﺍﻃﻼﻋﺎﺕ ϰﮐﻪ ﺍﺯ ﻫﺮ ﻧﻮﻉ
ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﺍﻱ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﮐﻨﺪ.
ﮐﻦ ﮐﻪ ﺑﻮﺳﻴﻠﻪ ﺁﻧﻬﺎ ﻣﻲ ﺗﻮﺍﻥ ﭘﺮﺱ ﻭ ﺟﻮﻫﺎﻱ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﺮﺩ LINQﻳﻪ ﺳﺮﻱ ﻣﺠﻤﻮﻋﻪ ﺩﺳﺘﻮﺭﺍﺕ ﺗﻮﺍﻧﻤﻨﺪ ﺭﺍ ﺍﺭﺍﺋﻪ ﻣﻲ ﺩ
ﮐﻪ ﺍﺯ ﻣﻮﺍﺭﺩﻱ ﭼﻮﻥ Joinﻫﺎ ،ﺗﻮﺍﺑﻊ ، Aggregationﻣﺮﺗﺐ ﺳﺎﺯﻱ ،ﻓﻴﻠﺘﺮ ﻭ ...ﭘﺸﺘﻴﺒﺎﻧﻲ ﮐﻨﺪ.ﺍﻳﻦ ﺩﺳﺘﻮﺭﺍﺕ ﺭﺍ language-
levelﻣﻲ ﻧﺎﻣﻨﺪ ﻭ ﺩﻳﮕﺮ ﻧﻴﺎﺯﻱ ﺑﻪ ﮐﺎﻣﭙﺎﻳﻞ ﺑﺮﺍﻱ ﺩﻳﺪﻥ ﻧﺘﻴﺠﻪ ﻧﻴﺴﺖ! ﺑﻠﻪ ﺍﻳﻦ ﻣﺸﮑﻠﻲ ﺑﻮﺩ ﮐﻪ ﺩﺭ ﺗﮑﻨﻮﻟﻮﮊﻱ ADO.NETﺑﺎ
ﺁﻥ ﺩﺳﺖ ﻭ ﭘﻨﺠﻪ ﻧﺮﻡ ﻣﻲ ﮐﺮﺩﻳﻢ ،ﻳﻌﻨﻲ ﺑﺮﺍﻱ ﻣﺸﺎﻫﺪﻩ ﻧﺘﻴﺠﻪ ﮐﻮﺋﺮﻱ ﺁﻥ ﺭﺍ ﺍﺟﺮﺍ ﻣﻲ ﮐﺮﺩﻳﻢ ﮐﻪ ﻣﺸﮑﻼﺗﻲ ﺍﺯ ﻗﺒﻴﻞ ﺧﻄﺎﻳﺎﺑﻲ
ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺭﺍ ﺩﺷﻮﺍﺭ ﻣﻲ ﮐﺮﺩ ﻭ ﻋﺮﺻﻪ ﺗﻮﺳﻌﻪ ﺭﺍ ﺑﺴﻴﺎﺭ ﻃﻮﻻﻧﻲ ﺗﺮ.
ﺷﺎﻳﺪ ﺷﻤﺎ ﻓﮑﺮ ﮐﻨﻴﺪﮐﻪ LINQﺍﺑﺰﺍﺭﻱ ﺍﺳﺖ ﮐﻪ ﺑﺘﻮﺍﻥ ﺑﺎ ﺁﻥ ﮐﻮﺋﺮﻱ ﻫﺎﻱ ﺑﺮ ﺭﻭﻱ ﺁﺭﺍﻳﻪ ﻭ ﻣﺠﻤﻮﻋﻪ ﻫﺎ ،ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﻭ
ﻳﺎ XMLﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﺮﺩ ﻭﻟﻲ ﺍﻳﻦ ﺗﻌﺮﻳﻒ ﺩﺭﺳﺘﻲ ﺍﺯ LINQﻧﻴﺴﺖ ﺑﻠﮑﻪ ﻳﮏ ﺗﮑﻨﻮﻟﻮﮊﻱ ﺍﺳﺖ ﮐﻪ ﺑﺘﻮﺍﻥ Providerﻫﺎﻱ ﺭﺍ
ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﺮﺩ ﺗﺎ ﺑﻮﺳﻴﻠﻪ ﺁﻥ ﺑﺎ ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﻫﺎ ﺍﺭﺗﺒﺎﻁ ﺑﺮﻗﺮﺍﺭ ﮐﺮﺩ ﺑﻪ ﻃﻮﺭ ﻣﺜﺎﻝ Providerﻫﺎﻱ ﻣﺎﻧﻨﺪ LINQ to SQLﻭ ﻳﺎ
LINQ to XMLﮐﻪ ﺗﻮﺳﻂ ﺗﻴﻢ ﺗﻮﺳﻌﻪ .NETﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺷﺪﻩ ﺍﻧﺪ ﮐﻪ ﺑﻪ ﺁﻥ ﻣﺪﻝ Providerﺍﻃﻼﻕ ﻣﻲ ﺷﻮﺩ.ϱ
ﺍﻟﺒﺘﻪ ﺑﺮﺍﻱ ﺍﻳﻨﮑﻪ ﺗﻴﻢ ﺗﻮﺳﻌﻪ ﺩﻫﻨﺪﻩ ﻟﻴﻨﮏ ﺑﺘﻮﺍﻧﺪ ﻟﻴﻨﮏ ﺭﺍ ﻃﺮﺍﺣﻲ ﮐﻨﺪ ﻣﻲ ﺑﺎﻳﺴﺖ ﻳﮏ ﺳﺮﻱ ﻗﺎﺑﻠﻴﺖ ﻫﺎ ﺭﺍ ﺩﺭ ﺯﺑﺎﻥ
ﻫﺎﻱ ﺩﺍﺕ ﻧﺘﻲ ﺑﻮﺟﻮﺩ ﻣﻲ ﺁﻭﺭﺩ ﺗﺎ ﺑﺘﻮﺍﻥ ﭘﺮﺱ ﻭ ﺟﻮ ﻫﺎ ﺭﺍ ﺩﺭ ﻫﻤﻪ ﻱ ﺯﺑﺎﻥ ﻫﺎﻱ ﺩﺍﺕ ﻧﺘﻲ ﺑﻪ ﻳﮏ ﺻﻮﺭﺕ ﺗﻮﻟﻴﺪ ﻭ ﺍﺳﺘﻔﺎﺩﻩ
1
PDC Professional Developers Conference
2
Anders Hejlsberg
3
Collection
4
Query Expression
5
LINQ Provider Model
www.AliAghdam.ir LINQ ﺻﻔﺤﻪ | 3ﻓﺼﻞ ﺍﻭﻝ – ﺁﺷﻨﺎﻳﻲ ﺑﺎ
ﮐﺮﺩ ﺑﻪ ﻫﻤﻴﻦ ﺩﻟﻴﻞ ﺑﺎ ﻣﻌﺮﻓﻲ ﻟﻴﻨﮏ ﺗﮑﻨﻮﻟﻮﮊﻱ ﻫﺎﻱ ﺟﺪﻳﺪﻱ ﻫﻤﺎﻧﻨﺪ ﺗﻮﺍﺑﻊ ﺍﻟﺤﺎﻗﻲ ﮐﻪ ﮐﺎﺭﮐﺮﺩ ﺍﺻﻠﻲ ﻟﻴﻨﮏ ﺭﺍ ﺗﺤﻘﻖ ﻣﻲ
ﺩﻫﺪ ﻭ ﺗﻮﺍﺑﻊ ﺑﻲ ﻧﺎﻡ ،ﻋﺒﺎﺭﺍﺕ ﻻﻣﺒﺪﺍ ﻭ ﭼﻨﺪﻱ ﺩﻳﮕﺮ ﮐﻪ ﺩﺭ ﻓﺼﻞ ﺑﻌﺪﻱ ﺑﻪ ﺑﺮﺭﺳﻲ ﻫﺮﻳﮏ ﺍﺯ ﺁﻧﻬﺎ ﺧﻮﺍﻫﻴﻢ ﭘﺮﺩﺍﺧﺖ.
ﺕﻭﺟﻪ
ﻫﺪﻑ ﺍﻳﻦ ﮐﺘﺎﺏ ﺁﻣﻮﺯﺵ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ Providerﻧﻴﺴﺖ ﻭﻟﻲ ﺑﺮﺍﻱ ﺁﺷﻨﺎﻳﻲ ﻣﻲ ﺗﻮﺍﻧﻴﺪ ﺑﻪ ﻣﻘﺎﻟﻪ ﺁﻗﺎﻱ ﭘﺪﺭﺍﻡ
U
ﻧﻤﻮﺩﺍﺭ ﺯﻳﺮ ﺗﻮﺳﻂ ﺍﻋﻀﺎﻱ ﺗﻴﻢ ﺗﻮﺳﻌﻪ ﺩﺍﺕ ﻧﺖ ﻭ LINQﺗﻬﻴﻪ ﺷﺪﻩ ﺍﺳﺖ ﮐﻪ ﺑﻪ ﺧﻮﺑﻲ ﻧﺤﻮﻩ ﻋﻤﻠﮑﺮﺩ ﻭ ﻣﻌﻤﺎﺭﻱ LINQﺭﺍ
ﻧﺸﺎﻥ ﻣﻲ ﺩﻫﺪ.
ﺑﺎﻻ ﺗﺮﻳﻦ ﺳﻄﺢ ﻧﻤﻮﺩﺍﺭ ﻧﺸﺎﻥ ﺩﻫﻨﺪﻩ ﺯﺑﺎﻥ ﻫﺎﻱ ﺍﺳﺖ ﮐﻪ ﭘﺸﺘﻴﺒﺎﻧﻲ ﮐﺎﻣﻠﻲ ﺍﺯ LINQﺍﻧﺠﺎﻡ ﻣﻲ ﺩﻫﻨﺪ.
ﺳﻄﺢ ﻣﻴﺎﻧﻲ ﺍﻳﻦ ﻧﻤﻮﺩﺍﺭ 5ﺑﺨﺶ ﺍﺻﻠﻲ ﭘﺮﻭﮊﻩ ﻟﻴﻨﮏ ﺭﺍ ﻧﺸﺎﻥ ﻣﻲ ﺩﻫﺪ :
:LINQ to Objectsﻳﮏ APIﺍﺳﺖ ﻭ ﻣﺘﺪﻫﺎﻱ ﮐﻪ ﻧﺸﺎﻥ ﺩﻫﻨﺪﻩ ﻋﻤﻠﮕﺮ ﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ ﻣﻲ ﺑﺎﺷﻨﺪ ﺭﺍ
ﻓﺮﺍﻫﻢ ﻣﻲ ﮐﻨﺪ .ﺍﻳﻦ ﻣﺘﺪﻫﺎ ﺑﺮﺍﻱ ﺑﺎﺯﻳﺎﺑﻲ ﺍﻃﻼﻋﺎﺕ ﺍﺯ ﺗﻤﺎﻣﻲ ﺍﺷﻴﺎﺋﻲ ﮐﻪ ﺭﺍﺑﻂ IEnumerableﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﺮﺩﻩ
ﺑﺎﺷﻨﺪ ،ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ) ﺁﺭﺍﻳﻪ ﻭ ﻣﺠﻤﻮﻋﻪ ﻋﺎﻡ ﻭ ﻏﻴﺮ ﻋﺎﻡ ﺩﺭﻭﻥ ﺣﺎﻓﻈﻪ(.
:LINQ to DataSetﺍﻳﻦ ﻣﺪﻝ،ﺍﺯ ﻋﻤﻠﻴﺎﺕ ﭘﺮﺱ ﻭ ﺟﻮ ﺑﺮ ﺭﻭﻱ DataTableﻫﺎ ﻭ DataSetﻫﺎﻱ ﻣﻮﺟﻮﺩ ﺩﺭ
ADO.NETﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﮐﻨﺪ.
:LINQ to SQLﻧﺎﻣﻲ ﺍﺳﺖ ﮐﻪ ﺑﺮﺍﻱ APIﻣﻌﻴﻦ ﺷﺪﻩ ﮐﻪ ﺑﻪ ﻭﺳﻴﻠﻪ ﺁﻥ ﺑﺎ ﻣﻲ ﺗﻮﺍﻥ ﺍﺯ ﺑﺎﻧﮏ ﻫﺎﻱ ﺭﺍﺑﻄﻪ ﺍﻱ ﻣﺎﻧﻨﺪ
SQL Severﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ.ﺑﻪ ﻃﻮﺭ ﺧﻼﺻﻪ ﺑﺎﻋﺚ ﺗﺴﻬﻴﻞ ﺩﺭ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺑﺎﻧﮏ ﺍﻃﻼﻋﺎﺗﻲ ﺭﺍ ﺑﺮﺍﻱ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺑﺎﻧﮏ
|ﺻﻔﺤﻪ4 LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
ﺍﻃﻼﻋﺎﺗﻲ ﺑﺮﺍﻱ ﭘﺮﺱ ﻭ ﺟﻮ ،ﺩﺭﺝ ،ﺣﺬﻑ ﻭ ﻭﻳﺮﺍﻳﺶ ﻣﻲ ﺷﻮﺩ .ﺑﺮﺍﻱ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ LINQ to SQLﻣﻲ ﺑﺎﻳﺴﺖ ﻳﮏ ﺍﺭﺟﺎﻉ
ﺑﻪ ﺍﺳﻤﺒﻠﻲ System.Data.Linq.dllﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ.
:LINQ to Entitiesﻳﮏ ﺭﺍﻩ ﺣﻞ ﺍﺭﺍﺋﻪ ﺷﺪﻩ ﺗﻮﺳﻂ Microsoft ORMﻣﻲ ﺑﺎﺷﺪ ﻭ ﺗﻮﺳﻌﻪ ﻳﺎﻓﺘﻪ LINQ to SQL
ﺍﺳﺖ LINQ to Entities.ﺑﻴﻦ ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﻱ ﻓﻴﺰﻳﮑﻲ ﻭ ﻃﺮﺍﺣﻲ ﻣﻨﻄﻘﻲ ﻭ ﺗﺠﺎﺭﻱ ﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﺩ ﻭ ﺍﺟﺎﺯﻩ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ
ﺁﻥ ﺭﺍ ﺑﻪ ﺻﻮﺭﺕ ﻣﻮﺟﻮﺩﻳﺖ� ﻫﺎ ﻣﻲ ﺩﻫﺪ )ﻣﻮﺟﻮﺩﻳﺖ ﻫﺎﻱ ﮐﻪ ﺷﺎﻳﺪ ﺍﺯ ﭼﻨﺪﻳﻦ ﺟﺪﻭﻝ ﺩﺭﺳﺖ ﺷﺪﻩ ﺑﺎﺷﻨﺪ(.
:LINQ to XMLﻋﻼﻭﻩ ﺑﺮ ﺗﻌﻤﻴﻢ ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ ﺷﺎﻣﻞ ﻳﮏ ﺳﺮﻱ ﺧﺼﻮﺻﻴﺎﺕ ﻭﻳﮋﻩ XML
ﺑﺮﺍﻱ ﺍﻳﺠﺎﺩ ﺍﺳﻨﺎﺩ XMLﻭ ﻫﻤﭽﻨﻴﻦ ﭘﺮﺱ ﻭ ﺟﻮ ﺑﺮ ﺭﻭﻱ ﺁﻧﻬﺎ ﻣﻲ ﺑﺎﺷﺪ ﺍﻟﺒﺘﻪ ﺗﻴﻢ ﺗﻮﺳﻌﻪ ﻟﻴﻨﮏ ﺧﺼﻮﺻﻴﺖ ﺟﺪﻳﺪﻱ
ﺑﺮﺍﻱ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺍﺳﻨﺎﺩ XMLﻃﺮﺍﺣﻲ ﻧﮑﺮﺩﻩ ﺑﻠﮑﻪ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ XML DOMﺭﺍ ﭘﺸﺘﻴﺒﺎﻧﻲ ﮐﺮﺩﻩ ﺍﺳﺖ ﻳﻌﻨﻲ ﺩﻳﮕﺮ ﻧﻴﺎﺯﻱ
LINQ to XMLﻣﻲ ﺑﺎﻳﺴﺖ ﻳﮏ ﺍﺭﺟﺎﻉ ﺑﻪ ﺍﺳﻤﺒﻠﻲ ﺑﻪ ﻳﺎﺩﮔﻴﺮﻱ XPathﻧﺪﺍﺭﻳﺪ .ﺑﺮﺍﻱ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ
System.Xml.Linq.dllﺑﻪ ﭘﺮﻭﮊﻩ ﺍﺿﺎﻓﻪ ﮐﻨﻴﺪ.
ﺍﻟﺒﺘﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎﻥ ﻣﻲ ﺗﻮﺍﻧﻨﺪ ﺍﻳﻦ Providerﻫﺎ ﺭﺍ ﺗﻮﺳﻌﻪ ﺩﻫﻨﺪ ﻭ ﻳﺎ ﺍﻳﻨﮑﻪ ﺑﺮﺍﻱ ﻣﺼﺎﺭﻑ ﺧﺎﺹ ﺍﺯ Providerﻫﺎﻱ ﺭﺍ
ﺗﻮﺳﻌﻪ ﺩﺍﺩﻩ ﻭ ﺍﺯ ﺁﻧﻬﺎ ﺍﺳﺘﻔﺎﺩﻩ ﮐﻨﻨﺪ .ﺩﺭ ﺯﻳﺮ ﻟﻴﺴﺘﻲ ﺍﺯ Providerﻫﺎﻱ ﺗﻮﺳﻌﻪ ﻳﺎﻓﺘﻪ ﺑﻪ ﻫﻤﺮﺍﻩ ﻟﻴﻨﮏ ﻣﺮﺑﻮﻃﻪ ،ﻣﻮﺟﻮﺩ ﺍﺳﺖ :
6
Entities
LINQ Extender
LINQ over C# project
U U
LINQ to Amazon
U U
LINQ to CRM
U U
LINQ to Excel
U U
LINQ to Expressions
U U
LINQ to Flickr
U U
LINQ to Geo
U U
LINQ to Google
U U
LINQ to Indexes
LINQ to JavaScript
U U
LINQ to JSON
U U
LINQ to LDAP
U U
LINQ to Lucene
U U
LINQ to Metaweb
U U
LINQ to MySQL
LINQ to NCover
LINQ to NHibernate
U U
LINQ to Opf3
LINQ to Parallel (PLINQ (
U U
LINQ to Sharepoint
U U
LINQ to SimpleDB
U U
LINQ to Streams
U U
LINQ to WebQueries
LINQ to WMI
U U
ﻣﺪﻝ ﺭﺍﺑﻄﻪ ﺍﻱ ﺩﺍﺭﺍﻱ ﻣﺰﺍﻳﺎﻳﻲ ﺍﺳﺖ ﮐﻪ ﺩﺭ ﻧﮕﺎﻩ ﺍﻭﻝ ﻣﺘﻮﺟﻪ ﺁﻥﻫﺎ ﻧﻤﻲ ﺷﻮﻳﻢ ﻭﻟﻲ ﺑﺎ ﻧﮕﺮﺵ ﺩﺭ ﺁﻥ ﺑﻪ ﺍﻳﻦ ﻣﺰﺍﻳﺎ ﻭﺍﻗﻒ ﻣﻲ
.ﺷﻮﻳﻢ
.ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ ﺗﻮﺍﻧﺪ ﺑﺎ ﺗﺼﻮﺭ ﺧﻮﺩ ﮐﻮﺋﺮﻱ ﻃﺮﺍﺣﻲ ﮐﻨﺪ ﻭ ﺁﻧﻬﺎ ﺭﺍ ﺑﻪ ﺻﻮﺭﺕ ﺑﺼﺮﻱ ﻭﻳﺮﺍﻳﺶ ﮐﻨﺪ
ﺑﺎ ﻓﺮﺍﻫﻢ ﺷﺪﻥ ﮔﺰﻳﻨﻪ ﻗﺒﻞ ﺷﺮﺍﻳﻄﻲ ﺑﻮﺟﻮﺩ ﻣﻲ ﺁﻳﺪ ﮐﻪ ﮐﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ ﺗﻮﺍﻧﺪ ﮐﻮﺋﺮﻱ ﺧﻮﺩ ﺭﺍ ﺑﻪ ﺣﺪﺍﮐﺜﺮ
.ﮐﺎﺭﺍﻳﻲ ﺧﻮﺩ ﺑﺮﺳﺎﻧﺪ ﭼﻮﻥ ﮐﻮﺋﺮﻱ ﺭﺍ ﻣﺸﺎﻫﺪﻩ ﻣﻲ ﮐﻨﺪ
|ﺻﻔﺤﻪ2 LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ ﺗﻮﺍﻧﺪ Providerﻱ ﺑﺮﺍﻱ ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﺧﻮﺩ ﻃﺮﺍﺣﻲ ﮐﻨﺪ ﺗﺎ ﺩﻳﮕﺮﺍﻥ ﺑﺎ ﺁﻥ ﺑﻪ ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﺍﻭ ﺩﺳﺘﺮﺳﻲ
ﺩﺍﺷﺘﻪ ﺑﺎﺷﻨﺪ ﺑﻪ ﻃﻮﺭ ﻣﺜﺎﻝ ﺍﮔﺮ ﺷﻤﺎ ﻳﮏ web serviceﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻭ ﺑﺨﻮﺍﻫﻴﺪ ﮐﺎﺭﺑﺮﺍﻥ ﺗﺤﺖ ﻳﮏ ﺳﻴﺴﺘﻢ ﺑﻪ
ﺁﻥ ﺩﺳﺘﺮﺳﻲ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻨﺪ ﺑﺮﺍﻱ ﺍﻳﻦ ﻣﻨﻄﻮﺭ ﻣﻲ ﺗﻮﺍﻧﻴﺪ ﻳﮏ Providerﻃﺮﺍﺣﻲ ﮐﻨﻴﺪ.
:System.Core.dllﺍﻧﻮﺍﻋﻲ ﺭﺍ ﺗﻌﺮﻳﻒ ﻣﻲ ﮐﻨﺪ ﮐﻪ LINQ APIﻣﺮﮐﺰﻱ ﺭﺍ ﻧﻤﺎﻳﺶ ﻣﻲ ﺩﻫﻨﺪ .ﺍﻳﻦ ﻳﮑﻲ ﺍﺯ
ﺍﺳﻤﺒﻠﻲ ﻫﺎﻱ ﺍﺳﺖ ﮐﻪ ﺷﻤﺎ ﺑﺎﻳﺪ ﺑﻪ ﺁﻥ ﺍﺭﺟﺎﻉ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ.
: System.Data.Linq.dllﮐﺎﺭﺍﻳﻲ ﺑﺮﺍﻱ ﺍﺳﺘﻔﺎﺩﻩ LINQﺑﺎ ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﻫﺎﻱ ﺭﺍﺑﻄﻪ ﺍﻱ ﺭﺍ ﻣﻬﻴﺎ ﻣﻲ
ﮐﻨﺪ(LINQ to SQL).
: System.Xml.Ling.dllﮐﺎﺭﺍﻳﻲ ﺑﺮﺍﻱ ﺍﺳﺘﻔﺎﺩﻩ LINQﺑﺎ ﺍﺳﻨﺎﺩ XMLﺭﺍ ﻓﺮﺍﻫﻢ ﻣﻲ ﮐﻨﺪLINQ to ).
(XML
www.AliAghdam.ir LINQ ﺻﻔﺤﻪ | 3ﻓﺼﻞ ﺍﻭﻝ – ﺁﺷﻨﺎﻳﻲ ﺑﺎ
;using System
;using System.Linq
;} "string[] myWords = { "hello world", "hello LINQ", "hello Aghdam
= var items
from item in myWords
)"where item.EndsWith("LINQ
;select item
ﻫﻤﺎﻧﻄﻮﺭ ﮐﻪ ﻣﺸﺎﻫﺪﻩ ﻓﺮﻣﻮﺩﻳﺪ ﻋﺒﺎﺭﺕ ﮐﻮﺋﺮﻱ ﺑﺎﻻ ﺑﺴﻴﺎﺭ ﺷﺒﻴﻪ ﺑﻪ ﮐﻮﺋﺮﻱ ﻫﺎﻱ SQLﺍﺳﺖ ،ﺣﺎﻻ ﻣﻲ ﺧﻮﺍﻫﻴﻢ ﻗﺴﻤﺖ ﻫﺎﻱ
ﺍﻳﻦ ﮐﺪ ﺭﺍ ﺷﺮﺡ ﺩﻫﻴﻢ ﻭ ﺍﮔﺮ ﺑﺎ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻫﺎ ﺁﺷﻨﺎ ﻧﻴﺴﺘﻴﺪ ﺩﺭ ﻓﺼﻮﻝ ﺑﻌﺪﻱ ﺑﺎ ﺁﻧﻬﺎ ﺁﺷﻨﺎ ﺧﻮﺍﻫﻴﺪ ﺷﺪ.
ﺩﺭ ﻗﺴﻤﺖ ﮐﻮﺋﺮﻱ ﻳﮏ ﻣﺘﻐﻴﺮ ﺍﺯ ﻧﻮﻉ varﺑﻪ ﻧﺎﻡ itemsﺗﻌﺮﻳﻒ ﺷﺪﻩ ﺍﺳﺖ ﮐﻪ ﺑﺮﺍﻱ ﺧﺮﻭﺟﻲ ﮐﻮﺋﺮﻱ ﻣﻮﺭﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻗﺮﺍﺭ
ﻣﻲ ﮔﻴﺮﺩ ،ﺳﭙﺲ itemsﺗﻮﺳﻂ ﻳﮏ ﻋﺒﺎﺭﺕ ﭘﺮﺱ ﻭ ﺟﻮﻱ LINQﻣﻘﺪﺍﺭﺩﻫﻲ ﺍﻭﻟﻴﻪ ﺷﺪﻩ ﺍﺳﺖ .ﺩﺭ ﻗﺴﻤﺖ ﺍﻭﻝ ﺍﺯ ﻋﺒﺎﺭﺕ
ﭘﺮﺱ ﻭ ﺟﻮ from،ﺑﺮﺍﻱ ﺗﻌﻴﻴﻦ ﻧﺎﻡ ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ .ﻣﺘﻐﻴﺮ itemﺩﺭ ﻋﺒﺎﺭﺕ ﻧﺸﺎﻧﮕﺮ ﻳﮏ ﻋﻀﻮ ﺩﺭ ﻣﺠﻤﻮﻋﻪ
itemsﺍﺳﺖ .
ﺩﺭ ﻗﺴﻤﺖ whereﺷﺮﻁ ﻫﺎﻱ ﻻﺯﻡ ﺑﺮﺍﻱ ﺑﺎﺯﻳﺎﺑﻲ ﺍﻃﻼﻋﺎﺕ ﺍﺯ ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﺗﺒﻴﻴﻦ ﺷﺪﻩ ﺍﺳﺖ ﮐﻪ ﺗﺎﺑﻊ Endwithﺍﺯ ﮐﻼﺱ
stringﻓﺮﺍﺧﻮﺍﻧﻲ ﺷﺪﻩ ﮐﻪ ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﻗﺴﻤﺖ ﭘﺎﻳﺎﻧﻲ ﺭﺷﺘﻪ ﺑﺎ " "LINQﺑﻪ ﭘﺎﻳﺎﻥ ﺑﺮﺳﺪ ،ﺍﻳﻦ ﺗﺎﺑﻊ ﻣﻘﺪﺍﺭ trueﺑﺮﻣﻲ ﮔﺮﺩﺍﻧﺪ
ﻭ ﺳﺮﺍﻧﺠﺎﻡ ﺩﺭ ﻗﺴﻤﺖ ، selectﻗﺴﻤﺖ ﻫﺎ /ﺑﺨﺶ ﻫﺎ /ﻳﺎ ﻓﻴﻠﺪ ﻫﺎﻱ ﮐﻪ ﻣﻲ ﺧﻮﺍﻫﻴﻢ ﻧﻤﺎﻳﺶ ﺩﻫﻴﻢ ﺭﺍ ﺍﻧﺘﺨﺎﺏ ﻣﻲ ﮐﻨﻴﻢ.
ﺧﺼﻮﺻﻴﺎﺕ ﺟﺪﻳﺪ C#ﺑﺮﺍﻱ LINQ
2 ﻫﻤﺎﻧﻄﻮﺭ ﮐﻪ ﺩﺭ ﻓﺼﻞ ﻗﺒﻞ ﮔﻔﺘﻴﻢ LINQﺗﻮﺍﻧﺎﻳﻲ ﺧﻮﺩ ﺭﺍ ﺑﻮﺳﻴﻠﻪ ﻗﺎﺑﻠﻴﺖ ﻫﺎﻱ ﺟﺪﻳﺪﻱ ﺑﻪ ﺩﺳﺖ ﻣﻲ ﺁﻭﺭﺩ
ﮐﻪ ﺑﺮﺍﻱ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ LINQﻣﻲ ﺑﺎﻳﺴﺖ ﺍﺯ ﺧﺼﻮﺻﻴﺎﺕ ﺟﺪﻳﺪ C#ﺍﺳﺘﻔﺎﺩﻩ ﮐﻨﻴﻢ ،ﺑﺮﺍﻱ ﺍﻳﻨﮑﻪ ﺑﺘﻮﺍﻧﻴﻢ ﺩﺭﮎ
ﺑﻬﺘﺮﻱ ﺍﺯ ﻋﺒﺎﺭﺍﺕ LINQﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﻢ ﻻﺯﻡ ﺍﺳﺖ ﺗﺎ ﺍﻳﻦ ﺧﺼﻮﺻﻴﺎﺕ ﺟﺪﻳﺪ ﺭﺍ ﮐﻪ ﺩﺭ C# 2.0ﻭ C# 3.0ﺑﻪ ﺯﺑﺎﻥ #C
ﺍﺿﺎﻓﻪ ﮔﺮﺩﻳﺪﻩ ﺭﺍ ﻓﺮﺍ ﺑﮕﻴﺮﻳﻢ.
ﺷﻤﺎ ﺑﻪ ﻋﻨﻮﺍﻥ ﻳﮏ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ، OOﻣﺰﺍﻳﺎﻱ ﺗﻌﺮﻳﻒ ﮐﻼﺱ ﻫﺎ ﺑﺮﺍﻱ ﻧﻤﺎﻳﺶ ﺟﺰﺋﻴﺎﺕ ﻭ ﮐﺎﺭﺍﻳﻲ ﻳﮏ ﻣﻮﺟﻮﺩﻳﺖ
ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺭﺍ ﻣﻲ ﺩﺍﻧﻴﺪ .ﻫﺮ ﻭﻗﺖ ﺷﻤﺎ ﻧﻴﺎﺯ ﺑﻪ ﺗﻌﺮﻳﻒ ﻳﮏ ﮐﻼﺱ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ،ﺁﻥ ﺭﺍ ﺗﻌﺮﻳﻒ ﻭ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﻣﻲ ﮐﻨﻴﺪ
ﻭﻟﻲ ﻫﻨﮕﺎﻣﻲ ﮐﻪ ﺷﻤﺎ ﻣﻲ ﺧﻮﺍﻫﻴﺪ ﻣﻲ ﺧﻮﺍﻫﻴﺪ ﮐﻼﺳﻲ ﺭﺍ ﺑﺮﺍﻱ ﻣﺪﻟﺴﺎﺯﻱ ﻣﺠﻤﻮﻋﻪ ﺍﻱ ﺍﺯ ﺩﺍﺩﻩ ﻫﺎﻱ ﮐﭙﺴﻮﻟﻪ ﺷﺪﻩ ﺑﺪﻭﻥ
ﺗﺎﺑﻊ ،ﺭﻭﻳﺪﺍﺩ ﻭ ﻳﺎ ﮐﺎﺭﺍﻳﻲ ﺳﻔﺎﺭﺷﻲ ﺩﻳﮕﺮﻱ ﺍﻳﺠﺎﺩ ﮐﻨﻴﺪ ﻭ ﺣﺘﻲ ﺍﻳﻦ ﻣﺪﻝ ﺳﺎﺯﻱ ﻓﻘﻂ ﺩﺭﻭﻥ ﭘﺮﻭﮊﻩ ﺷﻤﺎ ﻣﻮﺭﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻗﺮﺍﺭ
ﮔﺮﻓﺘﻪ ﺑﺎﺷﺪ ﻭ ﺩﻳﮕﺮ ﻗﺼﺪ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺁﻥ ﺭﺍ ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ،ﭼﮑﺎﺭ ﺍﻧﺠﺎﻡ ﻣﻲ ﺩﻫﻴﺪ¿ ﺁﻳﺎ ﮐﻼﺱ ﺟﺪﻳﺪﻱ ﺍﻳﺠﺎﺩ ﻣﻲ ﮐﻨﻴﺪ ؟
ﺍﻳﻨﺠﺎﺳﺖ ﮐﻪ ﻧﻮﻉ ﻫﺎﻱ ﺑﻲ ﻧﺎﻡ ﺑﻪ ﮐﻤﮏ ﺷﻤﺎ ﻣﻲ ﺁﻳﻨﺪ ﻭ ﻳﮏ ﻣﻴﺎﻥ ﺑﺮ ﺑﺴﻴﺎﺭ ﺑﺰﺭﮒ ﺭﺍ ﺩﺭ ﺟﻠﻮﻱ ﭘﺎﻱ ﺷﻤﺎ ﻗﺮﺍﺭ ﻣﻲ ﺩﻫﺪ.
ﻭﻗﺘﻲ ﻣﻲ ﺧﻮﺍﻫﻴﺪ ﻳﮏ ﻧﻮﻉ ﺑﻲ ﻧﺎﻡ ﺍﻳﺠﺎﺩ ﮐﻨﻴﺪ ﺍﻳﻦ ﮐﺎﺭ ﺭﺍ ﺑﺎ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﮐﻠﻤﻪ ﮐﻠﻴﺪﻱ varﺍﻧﺠﺎﻡ ﻣﻲ ﺩﻫﻴﺪ .ﻧﻮﻉ ﻫﺎﻱ ﺑﻲ
ﻧﺎﻡ ﺍﻳﻦ ﻗﺎﺑﻠﻴﺖ ﺭﺍ ﻓﺮﺍﻫﻢ ﻣﻲ ﮐﻨﻨﺪ ﮐﻪ ﺍﻧﻮﺍﻉ ﻗﻮﻱ ﻧﻮﻉ ﺑﻨﺪﻱ ﺷﺪﻩ ﺭﺍ ﺑﺪﻭﻥ ﻧﻴﺎﺯ ﺑﻪ ﺍﻳﺠﺎﺩ ﮐﻼﺱ ﻫﺎ ،ﺍﻳﺠﺎﺩ ﮐﻨﻴﺪ.
ﺩﺭ LINQﺍﺯ ﻧﻮﻉ ﻫﺎﻱ ﺑﻲ ﻧﺎﻡ ﺍﺳﺘﻔﺎﻩ ﺯﻳﺎﺩﻱ ﻣﻲ ﺷﻮﺩ ﭼﻮﻥ ﭘﺎﺳﺦ ﭘﺮﺱ ﻭ ﺟﻮﻫﺎ ﻣﻤﮑﻦ ﺍﺳﺖ ﻫﺮ ﻧﻮﻋﻲ ﺑﺎﺷﺪ ﻭ ﺍﺯ ﺁﻧﻬﺎ
ﺑﻪ ﻋﻨﻮﺍﻥ ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﻣﻮﻗﺘﻲ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ.
;)(Console.ReadLine
}
ﺩﺭ ﻋﺒﺎﺭﺕ ﺑﺎﻻ ﺑﻌﺪ ﺍﺯ ﮐﻠﻤﻪ ﮐﻠﻴﺪﻱ newﻫﻴﭻ ﮔﻮﻧﻪ ﻧﻮﻋﻲ ﺗﻌﻴﻴﻦ ﻧﺸﺪﻩ ﮐﻪ ﮐﺎﻣﭙﺎﻳﻠﺮ ﻳﮏ ﻧﻮﻉ ﺑﻲ ﻧﺎﻡ ﺍﻳﺠﺎﺩ ﻣﻲ ﮐﻨﺪ.
ﻧﻮﻉ ﻫﺎﻱ ﺑﻲ ﻧﺎﻡ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺍﺟﺎﺯﻩ ﻣﻲ ﺩﻫﺪ ﮐﻪ ﺍﺯ ﺧﺮﻭﺟﻲ ﭘﺮﺱ ﻭ ﺟﻮ ﻫﺎ ﺑﺪﻭﻥ ﻧﻴﺎﺯ ﺑﻪ ﺳﺎﺧﺖ ﮐﻼﺱ ﺟﺪﻳﺪ ،ﺍﺳﺘﻔﺎﺩﻩ
ﮐﻨﻨﺪ.
ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ | LINQﺻﻔﺤﻪ 6 www.AliAghdam.ir
ﺍﻣﺮﻭﺯﻩ ﺩﺭ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺮﺍﻱ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﻣﻮﺟﻮﺩﻳﺖ ﻫﺎ ﺍﺯ ﮐﻼﺱ ﻫﺎ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﮐﻨﻴﻢ ﮐﻪ ﺩﺭ ﻣﻬﻨﺪﺳﻲ ﻧﺮﻡ ﺍﻓﺰﺍﺭ ﺑﻪ ﺍﻳﻦ
ﺭﻭﺵ Entity Typesﺍﻃﻼﻕ ﻣﻲ ﺷﻮﺩ ﻭ ﺑﻪ ﻋﻨﻮﺍﻥ ﺑﺴﺘﻪ ﻫﺎﻱ ﺍﻃﻼﻋﺎﺗﻲ ﻣﺤﺴﻮﺏ ﻣﻲ ﺷﻮﻧﺪ ﻭﻟﻲ ﺩﺭ ﻃﻲ ﺍﻳﻦ ﺍﻣﺮ
ﻣﺸﮑﻼﺗﻲ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﮐﻪ ﻳﮑﻲ ﺍﺯ ﺁﻥ ﻫﺎ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺳﺎﺯﻧﺪﻩ ﻫﺎﻱ ﻣﺨﺘﻠﻒ ﺍﺳﺖ .ﺑﺎ ﻗﺎﺑﻠﻴﺖ ﺟﺪﻳﺪ ﺳﻲ ﺷﺎﺭﭖ ﻳﻌﻨﻲ ﻣﻘﺪﺍﺭ
ﺩﻫﻨﺪﻩ ﺍﻭﻟﻴﻪ ﺑﻪ ﺍﺷﻴﺎﺀ ﻣﻲ ﺗﻮﺍﻥ ﺗﺎ ﺣﺪ ﺑﺴﻴﺎﺭ ﺯﻳﺎﺩﻱ ﺍﺯ ﺍﻳﻦ ﭘﻴﭽﻴﺪﮔﻲ ﺟﻠﻮﮔﻴﺮﻱ ﮐﺮﺩ ﻭ ﻫﻤﭽﻨﻴﻦ ﺗﺎ ﺣﺪ ﺯﻳﺎﺩﻱ ﺍﺯ ﺑﺎﺭ
ﮐﺪﻧﻮﻳﺴﻲ ﮐﺎﺳﺖ ﺑﻪ ﻃﻮﺭﻱ ﮐﻪ ﻣﻲ ﺗﻮﺍﻥ ﺩﺭ ﻫﻨﮕﺎﻡ ﺍﻳﺠﺎﺩ ﻧﻤﻮﻧﻪ ﺍﺯ ﮐﻼﺱ ﺑﻪ ﻓﻴﻠﺪ ﻫﺎﻱ ﻋﻤﻮﻣﻲ ﻭ Propertyﻫﺎ
ﺩﺳﺘﺮﺳﻲ ﭘﻴﺪﺍ ﮐﺮﺩﻩ ﻭ ﺑﻪ ﺻﻮﺭﺕ ﺳﻔﺎﺭﺷﻲ ﺁﻧﻬﺎ ﺭﺍ ﻣﻘﺪﺍﺭ ﺩﻫﻲ ﻧﻤﻮﺩ.
ﺑﻪ ﻃﻮﺭ ﻣﺜﺎﻝ ﻣﻮﺟﻮﺩﻳﺖ Personﺭﺍ ﺑﺎ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺯﻳﺮ ﺩﺭ ﻧﻄﺮ ﺑﮕﻴﺮﻳﺪ..
class Person
{
public int ID
} ;{ get; set
ﺧﻮﺏ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻣﻮﺟﻮﺩﻳﺖ ﺑﺎﻻ ﮐﻪ ﺳﻪ ﺷﻨﺎﺳﻪ ﺭﺍ ﺗﻌﺮﻳﻒ ﮐﺮﺩﻩ ،ﺳﺎﺯﻧﺪﻩ ﺑﻪ ﭼﻪ ﺷﮑﻠﻲ ﺧﻮﺍﻫﺪ ﺑﻮﺩ ¿
ﺍﮔﺮ ﺍﺯ ﻣﻦ ﺑﭙﺮﺳﻴﺪ ﻣﻲ ﮔﻮﻳﻢ ﻫﻴﭻ ﻧﻴﺎﺯﻱ ﺑﻪ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺳﺎﺯﻧﺪﻩ ﺩﺭ ﻣﻮﺭﺩ ﮐﻼﺱ ﺑﺎﻻ ﻧﻴﺴﺖ! ﺑﻪ ﭼﻪ ﺷﮑﻞ ¿ ﺑﻪ ﺷﮑﻞ ﺯﻳﺮ :
ﮐﻠﻤﻪ ﮐﻠﻴﺪﻱ ) varﻧﻮﻉ ﺑﻨﺪﻱ ﺿﻤﻨﻲ(ﺑﻪ ﮐﺎﻣﭙﺎﻳﻠﺮ ﺍﻋﻼﻡ ﻣﻲ ﮐﻨﺪ ﮐﻪ ﺧﻮﺩﺵ ﺩﺭ ﻣﻮﺭﺩ ﻧﻮﻉ ﻣﺘﻐﻴﺮ ﺗﺼﻤﻴﻢ ﮔﻴﺮﻱ ﻣﻲ ﮐﻨﺪ
ﻭ ﻫﻴﭻ ﻣﻮﻗﻊ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻧﻤﻲ ﺗﻮﺍﻧﺪ ﺑﻪ ﺻﻮﺭﺕ ﺻﺮﻳﺢ ﻧﻮﻉ ﺁﻥ ﺭﺍ ﻣﺸﺨﺺ ﮐﻨﺪ ﺍﻟﺒﺘﻪ ﺍﻳﻦ ﺗﺼﻤﻴﻢ ﮔﻴﺮﻱ ﺑﺮﺍﻱ ﻧﻮﻉ ﻣﺘﻐﻴﺮ ﺩﺭ
ﺯﻣﺎﻥ ﺍﺳﺘﻔﺎﺩﻩ ﻭ ﻣﻘﺪﺍﺭﺩﻫﻲ ﺷﺪﻥ ﺍﻧﺠﺎﻡ ﻣﻲ ﮔﻴﺮﺩ .ﻧﻤﻮﻧﻪ ﺯﻳﺮ ﻳﮏ ﻣﺜﺎﻝ ﺳﺎﺩﻩ ﺍﺯ varﺭﺍ ﻧﺸﺎﻥ ﻣﻲ ﺩﻫﺪ.
;var i = 1
i = "Hello LINQ"; // An error generated by this line
ﺗﻮﺿﻴﺢ :ﺩﺭ ﺧﻂ ﺍﻭﻝ ﺑﺎ ﻣﻘﺪﺍﺭ ﺩﻫﻲ 1ﺑﻪ ﻣﺘﻐﻴﺮ iﮐﺎﻣﭙﺎﻳﻠﺮ ﻧﻮﻉ ﻣﺘﻐﻴﺮ iﺭﺍ ﺍﺯ ﻧﻮﻉ System.Int32ﺩﺭ ﻧﻈﺮ ﻣﻲ ﮔﻴﺮﺩ،
ﺑﺎ ﺍﻳﻦ ﺍﻭﺻﺎﻑ ﻣﻨﻄﻘﻲ ﺍﺳﺖ ﮐﻪ ﺍﺯ ﺧﻂ ﺩﻭﻡ ﺧﻄﺎ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ.
ﺑﻴﺸﺘﺮ ﺑﺪﺍﻧﻴﻢ
ﺩﺭ ﺍﺻﻞ varﻳﮏ ﮐﻠﻤﻪ ﮐﻠﻴﺪﻱ C#ﻧﻴﺴﺖ ﻭﻟﻲ ﻣﻲ ﺗﻮﺍﻥ ﺍﺯ ﺍﻳﻦ ﺗﻮﮐﻦ ﺑﺪﻭﻥ ﺭﺥ ﺩﺍﺩﻥ ﺧﻄﺎ ﺑﻪ ﻋﻨﻮﺍﻥ ﻳﮏ ﻧﻮﻉ ﺩﺍﺩﻩ
ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ ﺍﻣﺎ ﺩﺭ ﻫﻨﮕﺎﻡ ﮐﺎﻣﭙﺎﻳﻞ ﺷﺪﻥ ﮐﺪ ،ﮐﺎﻣﭙﺎﻳﻠﺮ ﺁﻥ ﺭﺍ ﺍﺯ ﺭﻭﻱ ﻗﺮﺍﻳﻦ ﺑﻪ ﻋﻨﻮﺍﻥ ﻳﮏ ﮐﻠﻤﻪ ﮐﻠﻴﺪﻱ ﻣﻲ ﺷﻨﺎﺳﺪ.
ﺍﺯ ﺍﻳﻦ ﻗﺎﺑﻠﻴﺖ ﻣﻲ ﺗﻮﺍﻥ ﺑﺮﺍﻱ ﮔﺎﻫﺶ ﺗﮑﺮﺍﺭ ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ ﻣﺜﻼ ﮐﺪ ﺯﻳﺮ ﺭﺍ ﺩﺭ ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ:
ﺩﺭ ﮐﺪ ﺑﺎﻻ ﻣﺎ ﻧﻴﺎﺯﻱ ﺑﻪ ﻗﻴﺪ ﮐﺮﺩﻥ ﺻﺮﻳﺢ > List<intﺩﺭ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ myNumbersﻧﺪﺍﺷﺘﻴﻢ ﻭ ﻣﻲ ﺗﻮﺍﻧﻴﻢ ﺁﻥ
ﮐﺪ ﺭﺍ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﻭ ﮐﻮﺗﺎﻩ ﺗﺮ ﺑﻨﻮﻳﺴﻴﻢ.
ﻧﮑﺘﻪ
ﺗﻮﺟﻪ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ﺍﻳﻦ ﻋﻤﻞ ﺭﺍ ﻃﻮﺭﻱ ﺍﻧﺠﺎﻡ ﺩﻫﻴﺪ ﺗﺎ ﺩﺭ ﻫﻨﮕﺎﻡ ﻣﺮﺍﺟﻌﻪ ﺩﻭﺑﺎﺭﻩ ﺑﻪ ﮐﺪ ﺑﺘﻮﺍﻧﻴﺪ ﻧﺤﻮﻩ ﻭ ﻧﻮﻉ ﻣﺘﻐﻴﺮﺭﺍ
ﺗﺸﺨﻴﺺ ﺩﻫﻴﻢ.
ﺩﺭ ﻫﻨﮕﺎﻡ ﺍﺳﺘﻔﺎﺩﻩ ﻧﻮﻉ ﺑﻨﺪﻱ ﺿﻤﻨﻲ ﻣﺤﻮﺩﻳﺖ ﻫﺎﻱ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﮐﻪ ﺩﺭ ﺯﻳﺮ ﺑﻪ ﻣﻌﺮﻓﻲ ﺁﻧﻬﺎ ﻣﻲ ﭘﺮﺩﺍﺯﻡ:
ﺍﻭﻟﻴﻦ ﻭ ﻣﻬﻢ ﺗﺮﻳﻦ ﻣﺤﺪﻭﺩﻳﺖ ﺍﻳﻦ ﮐﻪ ﻧﻮﻉ ﺑﻨﺪﻱ ﺿﻤﻨﻲ ﺗﻨﻬﺎ ﺑﻪ ﻣﺘﻐﻴﺮ ﻫﺎﻱ ﺩﺭﻭﻥ ﻳﮏ ﺗﺎﺑﻊ ﻳﺎ ﺧﺼﻮﺻﻴﺖ ﺍﻋﻤﺎﻝ ﻣﻲ
ﺷﻮﺩ .ﺑﻨﺎﺑﺮﺍﻳﻦ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﮐﻠﻤﻪ ﻧﻮﻉ ﺑﻨﺪﻱ ﺿﻤﻨﻲ ﺑﺮﺍﻱ ﺗﻌﺮﻳﻒ ﻣﻘﺎﺩﻳﺮ ﺑﺎﺯﮔﺸﺘﻲ ،ﭘﺎﺭﺍﻣﺘﺮﻫﺎ ﻭ ﻳﺎ ﺩﺍﺩﻩ ﻫﺎﻱ ﺍﺧﺘﺼﺎﺻﻲ ﻳﮏ
ﻧﻮﻉ ﻏﻴﺮ ﻣﺠﺎﺯ ﺍﺳﺖ.
class varTestClass
{
!//Error : var cannot be used as field Data
;private var myNumber = 1
ﻣﺘﻐﻴﺮﻫﺎﻱ ﻧﻮﻉ ﺑﻨﺪﻱ ﺿﻤﻨﻲ ﻣﻲ ﺑﺎﻳﺴﺖ ﺩﺭ ﺯﻣﺎﻥ ﺗﻌﺮﻳﻒ ﻣﻘﺪﺍﺭ ﺩﻫﻲ ﺷﻮﻧﺪ ﺗﺎ ﻧﻮﻉ ﺁﻧﻬﺎ ﻣﺸﺨﺺ ﮔﺮﺩﺩ ﻭ ﺩﺭ ﺻﻮﺭﺕ ﺭﻫﺎ
ﺷﺪﻥ ﺑﺪﻭﻥ ﻣﻘﺪﺍﺭ ﺩﻫﻲ)ﺑﺎ ﻣﻘﺪﺍﺭ (nullﺩﺳﺘﻮﺭ ﻣﺬﮐﻮﺭ ﺑﺎ ﺧﻄﺎ ﺭﻭﺑﻪ ﺭﻭ ﺧﻮﺍﻫﺪ ﺷﺪ )ﻫﻤﺎﻧﻨﺪ ﻗﻮﺍﻧﻴﻦ ﺗﻌﺮﻳﻒ ﻳﮏ ﻣﺘﻐﻴﺮ ﺍﺯ ﻧﻮﻉ
.(const
ﺑﺮﺍﻱ ﺗﮑﻤﻴﻞ ﻣﺜﺎﻝ ﻗﺒﻞ ﺗﻮﺟﻪ ﮐﻨﻴﺪ ﮐﻪ ﺍﻣﮑﺎﻥ ﺗﻌﺮﻳﻒ ﻳﮏ ﻣﺘﻐﻴﺮ ﻣﺤﻠﻲ ﺑﺎ ﻧﻮﻉ ﺑﻨﺪﻱ ﺿﻤﻨﻲ nullableﺑﺎ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ
ﺗﻮﮐﻦ ? ﻭﺟﻮﺩ ﻧﺪﺍﺭﺩ.
ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺍﻣﮑﺎﻥ ﺑﻪ ﺩﺳﺖ ﺁﻭﺭﺩﻥ ﮐﺎﺭﺍﻳﻲ ﺟﺪﻳﺪ ﺭﺍ ﺑﺪﻭﻥ ﻧﻴﺎﺯ ﺑﻪ ﺍﺻﻼﺡ ﻣﺴﺘﻘﻴﻢ ﻧﻮﻉ ﻣﻮﺭﺩ ﺗﻮﺳﻌﻪ ﻭ ﻳﺎ ﺍﻧﻮﺍﻉ ﮐﺎﻣﭙﺎﻳﻞ
ﺷﺪﻩ ﻣﻮﺟﻮﺩ )ﮐﻼﺱ ﻫﺎ struct ،ﻫﺎ ﻭ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﻫﺎﻱ ﺍﻳﻨﺘﺮﻓﻴﺲ( ﻭ ﻫﻤﭽﻨﻴﻦ ﺍﻧﻮﺍﻉ ﺩﺭ ﺣﺎﻝ ﮐﺎﻣﭙﺎﻳﻞ ﮐﻨﻮﻧﻲ ﺭﺍ ﺑﻮﺟﻮﺩ
ﻣﻲ ﺁﻭﺭﺩ )ﺑﻪ ﺩﻟﻴﻞ ﺩﺭ ﺩﺳﺘﺮﺱ ﻧﺒﻮﺩﻥ ﮐﺪ ﻭ ﻳﺎ ﺍﺟﺎﺯﻩ ﻧﺪﺍﺩﻥ ﮐﻼﺱ ﺑﺮﺍﻱ ﺍﺭﺙ ﺑﺮﻱ( .ﺍﻳﻦ ﺗﮑﻨﻴﮏ ﺑﺮﺍﻱ ﺗﺰﺭﻳﻖ ﮐﺎﺭﺍﻳﻲ ﺟﺪﻳﺪ
ﺑﻪ ﺍﻧﻮﺍﻋﻲ ﮐﻪ ﮐﺪ ﭘﺎﻳﻪ ﺁﻧﻬﺎ ﻭﺟﻮﺩ ﻧﺪﺍﺭﺩ ،ﺑﺴﻴﺎﺭ ﺳﻮﺩﻣﻨﺪ ﺧﻮﺍﻫﺪ ﺑﻮﺩ ﻭ ﻗﺎﺑﻠﻴﺖ ﺍﺻﻠﻲ ﭘﺮﺱ ﻭ ﺟﻮ ﻟﻴﻨﮏ ﺗﻮﺳﻂ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺑﻪ
ﺩﺳﺖ ﺁﻣﺪﻩ ﺍﺳﺖ.
ﺩﺭ ﺗﻌﺮﻳﻒ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺍﻭﻟﻴﻦ ﻣﺤﺪﻭﺩﻳﺘﻲ ﮐﻪ ﺑﺎ ﺁﻥ ﺭﻭﺑﻪ ﺭﻭ ﻣﻲ ﺷﻮﻳﻢ ﺍﻱﻥ ﺍ ﺳﺖ ﮐﻪ ﺁﻧﻬﺎ ﺑﺎﻳﺪ ﺩﺭﻭﻥ ﻳﮏ ﮐﻼﺱ static
ﺗﻌﺮﻳﻒ ﺷﻮﻧﺪ ،ﺑﻨﺎﺑﺮﺍﻳﻦ ﻫﺮ ﺗﺎﺑﻊ ﺗﻮﺳﻌﻪ ﻣﻲ ﺑﺎﻳﺴﺖ ﺑﺎ ﮐﻠﻤﻪ ﮐﻠﻴﺪﻱ staticﺗﻌﺮﻱﻑ ﺷﻮﺩ ﺩﻭﻣﻴﻦ ﻣﺤﺪﻭﺩﻳﺖ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ ﻣﺎ
ﺑﺮﺍﻱ ﺍﻋﻼﻡ ﺍﻳﻦ ﺗﺎﺑﻊ ﺑﻪ ﻋﻨﻮﺍﻥ ﺗﺎﺑﻊ ﺗﻮﺳﻌﻪ ﺑﻪ ﮐﺎﻣﭙﺎﻳﻠﺮ ﻣﻲ ﺑﺎﻳﺴﺖ ﺑﺎ ﻳﮏ ﮐﻠﻤﻪ ﮐﻠﻴﺪﻱ thisﺩﺭ ﺍﻭﻟﻴﻦ )ﻭ ﻓﻘﻂ ﺍﻭﻟﻴﻦ (
ﭘﺎﺭﺍﻣﺘﺮ ﻭﺭﻭﺩﻱ ﺗﺎﺑﻊ ﺍﺳﺘﻔﺎﺩﻩ ﮐﻨﻴﻢ.
ﻧﮕﺎﺗﻲ ﮐﻪ ﺑﺎﻳﺪ ﺩﺭ ﻫﻨﮕﺎﻡ ﺗﻌﺮﻳﻒ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺑﺎﻳﺪ ﺑﻪ ﺁﻧﻬﺎ ﺗﻮﺟﻪ ﮐﻨﻴﺪ:
ﺍﮔﺮ ﻳﮏ ﺗﺎﺑﻊ ﺗﻮﺳﻌﻪ ﺗﻌﺮﻳﻒ ﮐﺮﺩﻩ ﺍﻳﺪ ﻭﻟﻲ ﻳﮏ ﺗﻮﺳﻌﻪ ﺩﺍﺧﻠﻲ ﺑﺎ ﺍﻟﮕﻮﻳﻲ ﻣﺸﺎﺑﻪ )ﻧﻪ ﺍﻟﺒﺘﻪ ﻳﮑﺴﺎﻥ( ﻭﺟﻮﺩ
ﺩﺍﺷﺖ¡ ﺍﻭﻟﻮﻳﺖ ﻓﺮﺍﺧﻮﺍﻧﻲ ﺑﺎ ﺗﻮﺳﻌﻪ ﺩﺍﺧﻠﻲ ﺍﺳﺖ.
ﺧﺼﻮﺻﻴﺎﺕ ،ﺭﻭﻳﺪﺍﺩﻫﺎ ﻭ ﻋﻤﻠﮕﺮﻫﺎ ﻗﺎﺑﻞ ﺗﻮﺳﻌﻪ ﻧﻴﺴﺘﻨﺪ ﻭﻟﻲ ﻣﻄﺮﺡ ﺷﺪﻩ ﺍﻧﺪ ﻭ ﺍﻣﻴﺪ ﺍﺳﺖ ﺩﺭ ﻧﺴﺨﻪ ﻫﺎﻱ
ﺑﻌﺪﻱ C#ﺍﻳﻦ ﻗﺎﺑﻠﻴﺖ ﻫﺎ ﻧﻴﺰ ﺍﻓﺰﻭﺩﻩ ﺷﻮﻧﺪ.
ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ | LINQﺻﻔﺤﻪ10 www.AliAghdam.ir
ﺑﻴﺸﺘﺮ ﺑﺪﺍﻧﻴﻢ
ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺫﺍﺗﺎ ﺗﻮﺍﺑﻊ ﺍﻳﺴﺘﺎﻱ ﻣﻌﻤﻮﻟﻲ ﻫﺴﺘﻨﺪ ﮐﻪ ﻣﻲ ﺗﻮﺍﻧﻨﺪ ﺩﺭ ﻳﮏ ﻧﻤﻮﻧﻪ ﺍﺯ ﻧﻮﻉ ﺗﻮﺳﻌﻪ ﻳﺎﻓﺘﻪ ﻣﻮﺭﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻗﺮﺍﺭ
ﮔﻴﺮﻧﺪ ﮐﻪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻗﻮﺍﻋﺪ ﻧﺤﻮﻱ ﺗﻮﺍﺑﻊ ﺍﻳﺴﺘﺎ ﻧﻤﻲ ﺗﻮﺍﻧﻨﺪ ﺑﻪ ﺍﻋﻀﺎﻱ )ﻓﻴﻠﺪ ﻭ ﻳﺎ ﺗﻮﺍﺑﻊ( ﺩﻳﮕﺮ ﻧﻮﻉ ﺗﻮﺳﻌﻪ ﻳﺎﻓﺘﻪ ،ﺩﺳﺘﺮﺳﻲ
ﭘﻴﺪﺍ ﮐﻨﻨﺪ ﮐﻪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺍﻳﻦ ﻣﺴﻌﻠﻪ ﺗﻮﺳﻌﻪ ﺩﺍﺩﻥ ﺑﺎ ﺑﻪ ﺍﺭﺙ ﺑﺮﺩﻥ ﺑﻪ ﮐﻠﻲ ﺗﻔﺎﻭﺕ ﺩﺍﺭﺩ ﻭ ﺷﻤﺎ ﻧﻤﻲ ﺗﻮﺍﻧﻴﺪ ﻳﮏ ﻓﻴﻠﺪ ﻳﮏ
ﮐﻼﺱ ﺭﺍ ﺗﻮﺳﻂ ﺗﺎﺑﻊ ﺗﻮﺳﻌﻪ ﺧﻮﺩ ﻣﻮﺭﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻗﺮﺍﺭ ﺩﻫﻴﺪ.
ﻧﮑﺘﻪ
ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺗﻤﺎﻣﻲ ﻗﺎﺑﻠﻴﺖ ﻫﺎﻱ ﺗﻮﺍﺑﻊ ﺍﻳﺴﺘﺎﻱ ﻣﻌﻤﻮﻝ ﺭﺍ ﺩﺍﺭﺍ ﻣﻲ ﺑﺎﺷﻨﺪ ﻳﻌﻨﻲ ﻣﻲ ﺗﻮﺍﻥ ﺁﻧﻬﺎ ﺭﺍ ﺑﻮﺳﻴﻠﻪ ﺗﻮﺍﺑﻊ ﺍﻳﺴﺘﺎ ﻭ ﻳﺎ
ﻧﻤﻮﻧﻪ ﺳﺎﺯﻱ ﺷﺪﻩ ﻓﺮﺍﺧﻮﺍﻧﻲ ﻧﻤﻮﺩ.
ﺑﻪ ﻃﻮﺭ ﻣﺜﺎﻝ ﺍﺯ ﺗﺎﺑﻊ ﺗﻮﺳﻌﻪ ﻣﺜﺎﻝ ﺑﺎﻻ ﺩﺭ ﺍﻳﻦ ﻣﺜﺎﻝ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﮐﻨﻴﻢ.
www.AliAghdam.ir ﺻﻔﺤﻪ | 11ﻓﺼﻞ ﺩﻭﻡ – ﺧﺼﻮﺻﻴﺎﺕ ﺟﺪﻳﺪ C#ﺑﺮﺍﻱ LINQ
ﻫﻤﺎﻧﻄﻮﺭ ﮐﻪ ﻣﺸﺎﻫﺪﻩ ﻣﻲ ﮐﻨﻴﺪ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺩﻳﮕﺮﻱ ﻧﻴﺰ ﻭﺟﻮﺩ ﺩﺍﺭﻧﺪ ﮐﻪ ﺍﮐﺜﺮﻳﺖ ﺁﻧﻬﺎ ﻧﻴﺰ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ LINQﻫﺴﺘﻨﺪ.
ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ | LINQﺻﻔﺤﻪ12 www.AliAghdam.ir
ﺑﺮﺍﻱ ﺷﺮﻭﻉ ﻳﮏ ﺭﺍﺑﻂ ﺟﺪﻳﺪ ﺑﻪ ﻧﺎﻡ ILocatableﺍﻳﺠﺎﺩ ﮐﻨﻴﺪ ﻭ ﺳﭙﺲ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺯﻳﺮ ﺭﺍ ﺑﺮﺍﻱ ﺁﻥ ﺗﻌﺮﻳﻒ ﮐﻨﻴﺪ.
ﺭﺍﺑﻂ ILocatableﺩﺍﺭﺍﻱ ﺩﻭ ﻣﺘﺪ ﺍﺳﺖ ﮐﻪ ﺩﺭ ﮐﻼﺱ Carﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺷﺪﻩ ﺍﺳﺖ .ﺑﺎﻓﺮﺽ ﺍﻳﻨﮑﻪ ﻣﺎ ﺑﻪ ﮐﺪ ﺭﺍﺑﻂ
ILocatableﺩﺳﺘﺮﺳﻲ ﻧﺪﺍﺭﻳﻢ ﻭﻳﺎ ﻧﻤﻲ ﺧﻮﺍﻫﻴﻢ ﺩﺭ ﺁﻥ ﺗﻐﻴﻴﺮﻱ ﺑﺪﻫﻴﻢ ﻭ ﻣﻲ ﺧﻮﺍﻫﻴﻢ ﺁﻥ ﺭﺍ ﺗﻮﺳﻌﻪ ﺩﻫﻴﻢ ﮐﻪ ﺑﺮﺍﻱ ﺍﻳﻦ
ﻋﻤﻞ ﺭﺍ ﻧﻤﻲ ﺗﻮﺍﻥ ﺑﻪ ﺷﮑﻞ ﻣﻌﻤﻮﻝ ﺍﻧﺠﺎﻡ ﺩﻫﻴﻢ .
ﺑﺮﺍﻱ ﺍﻳﻨﮑﻪ ﻳﮏ ﺭﺍﺑﻂ ﺭﺍ ﺗﻮﺳﻌﻪ ﺩﻫﻴﻢ ﻣﻲ ﺑﺎﻳﺴﺖ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺁﻥ ﺗﻮﺍﺑﻊ ﺭﺍ ﻧﻴﺰ ﻣﻬﻴﺎ ﮐﻨﻴﺪ ﻭ ﺍﻳﻦ ﺭﺍ ﺑﻪ ﺍﻳﻦ ﺻﻮﺭﺕ ﻓﺮﺽ
ﮐﻨﻴﺪ ﮐﻪ ﮐﻼﺱ ﻫﺎﻱ ﮐﻪ ﺍﻳﻦ ﺭﺍﺑﻂ ﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﻣﻲ ﮐﻨﻨﺪ ﺷﺎﻣﻞ ﻳﮏ ﻣﺘﺪ ﺑﺎ ﺍﻳﻦ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﻫﺴﺘﻨﺪ .ﺍﻳﻦ ﻋﻤﻞ ﺭﺍ ﺩﺭ
ﻣﺜﺎﻝ ﺯﻳﺮ ﻣﺸﺎﻫﺪﻩ ﮐﻨﻴﺪ.
1
Interface
www.AliAghdam.ir ﺻﻔﺤﻪ | 13ﻓﺼﻞ ﺩﻭﻡ – ﺧﺼﻮﺻﻴﺎﺕ ﺟﺪﻳﺪ C#ﺑﺮﺍﻱ LINQ
ﺣﺎﻝ ﺯﻣﺎﻧﻲ ﮐﻪ ﺍﺯ ﮐﻼﺳﻲ ﮐﻪ ﺭﺍﺑﻂ ILocatableﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﺮﺩﻩ ﻧﻤﻮﻧﻪ ﺳﺎﺯﻱ ﺷﻮﺩ ،ﺁﻥ ﮐﻼﺱ ﻣﻲ ﺗﻮﺍﻧﺪ ﺑﻪ
ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺩﺍﺩﻩ ﺷﺪﻩ ﺩﺳﺘﺮﺳﻲ ﭘﻴﺪﺍ ﮐﻨﺪ.
;)car.MoveNorth(23
;)car.MoveWest(23
ﺑﻴﺸﺘﺮ ﺑﺪﺍﻧﻴﻢ
ﺑﺮﺍﻱ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺑﻬﺘﺮ ﺍﺳﺖ ﮐﺘﺎﺑﺨﺎﻧﻪ ﺍﻱ ﺍﺯ ﺁﻥ ﺩﺭ ﺩﺳﺘﻪ ﺑﻨﺪﻱ ﻫﺎﻱ ﻣﺨﺘﻠﻒ ﺗﻬﻴﻪ ﮐﻨﻴﺪ ﺗﺎ ﺍﺯ ﺁﻧﻬﺎ ﺑﺘﻮﺍﻧﻴﺪ
ﺩﺭ ﭘﺮﻭﮊﻩ ﻫﺎﻱ ﻣﺨﺘﻠﻒ ﺑﻪ ﺭﺍﺣﺘﻲ ﺍﺳﺘﻔﺎﺩﻩ ﮐﻨﻴﺪ ﻫﻤﭽﻨﻴﻦ ﻳﮏ ﭘﺎﻳﮕﺎﻩ ﺍﻳﻨﺘﺮﻧﺘﻲ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﮐﻪ ﺩﺭ ﺁﻥ ﮐﺎﺭﺑﺮﺍﻥ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ
ﺧﻮﺩ ﺭﺍ ﺑﻪ ﺍﺷﺘﺮﺍﮎ ﻣﻲ ﮔﺬﺍﺭﻧﺪ ﮐﻪ ﻣﻲ ﺗﻮﺍﻧﺪ ﺑﻪ ﻋﻨﻮﺍﻥ ﻳﮏ ﭘﺎﻳﮕﺎﻩ ﻋﻈﻴﻢ ﺍﻃﻼﻋﺎﺗﻲ ﻣﻮﺭﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻗﺮﺍﺭ ﮔﻴﺮﺩ.
ﺍﻳﻦ ﭘﺎﻳﮕﺎﻩ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺭﺍ ﺑﺮﺍﻱ ﺳﻪ ﺯﺑﺎﻥ F#¡ C#ﻭ ﻭﻳﮋﻭﺍﻝ ﺑﻴﺴﻴﮏ ﻭ ﺩﺭ ﺩﺳﺘﻪ ﺑﻨﺪﻱ ﻫﺎﻱ ﺑﺴﻴﺎﺭ ﺯﻳﺎﺩ ﺍﺭﺍﺋﻪ ﻣﻲ ﮐﻨﺪ.
ﻋﺒﺎﺭﺍﺕ ﻻﻣﺒﺪﺍ ﺗﻮﺍﺑﻊ ﻧﺎﺷﻨﺎﺧﺘﻪ ﺍﻱ ﻫﺴﺘﻨﺪ ﮐﻪ ﻣﻲ ﺗﻮﺍﻧﻨﺪ ﺷﺎﻣﻞ ﻋﺒﺎﺭﺍﺕ ﻭ ﻗﻄﻌﺎﺕ ﮐﺪ ﺑﺎﺷﻨﺪ ﮐﻪ ﻣﻲ ﺗﻮﺍﻥ ﺍﺯ ﺁﻧﻬﺎ ﺑﺮﺍﻱ
ﺳﺎﺧﺖ ﺩﺭﺧﺖ ﻫﺎﻱ ﻋﺒﺎﺭﺕ Ϯﻭ Delegateﻫﺎ ﺍﺳﺘﻔﺎﺩﻩ ﻧﻤﻮﺩ .ﻋﺒﺎﺭﺍﺕ ﻻﻣﺒﺪﺍ ﺍﻳﻦ ﺍﻣﮑﺎﻥ ﺭﺍ ﻓﺮﺍﻫﻢ ﻣﻲ ﮐﻨﻨﺪ ﮐﻪ ﺗﻮﺍﺑﻌﻲ
ﺍﻳﺠﺎﺩ ﻧﻤﻮﺩﻩ ﻭ ﺁﻧﻬﺎ ﺭﺍ ﺑﻪ ﻋﻨﻮﺍﻥ ﺁﺭﮔﻮﻣﺎﻥ ﺑﻪ ﻣﺘﺪﻫﺎ ﺍﺭﺳﺎﻝ ﮐﺮﺩ.
ﻋﺒﺎﺭﺍﺕ ﻻﻣﺒﺪﺍ ﻳﮏ ﺗﺎﺑﻊ ﺭﺍ ﻋﻨﻮﺍﻥ ﺧﺮﻭﺟﻲ ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻭ ﺗﻮﺍﻧﺎﻳﻲ ﺗﻌﺮﻳﻒ ﺗﻮﺍﺑﻊ Inlineﺭﺍ ﻓﺮﺍﻫﻢ ﻣﻲ ﮐﻨﻨﺪ .ﺗﻮﺟﻪ ﮐﻨﻴﺪ ﮐﻪ
ﻧﻮﺷﺘﻦ ﻋﺒﺎﺭﺍﺕ Lambdaﻫﻴﭻ ﭘﻴﭽﻴﺪﮔﻲ ﻧﺪﺍﺭﺩ ﻭ ﺧﻮﺍﻫﻴﺪ ﻓﻬﻤﻴﺪ ﮐﻪ ﺑﺴﻴﺎﺭ ﻫﻢ ﺩﺭ LINQﻭ Delegateﻫﺎ ﭘﺮ ﮐﺎﺭﺑﺮﺩ
ﻫﺴﺘﻨﺪ.
ﺑﺮﺍﻱ ﺗﻌﺮﻳﻒ ﻳﮏ ﺗﺎﺑﻊ ﻣﻌﻤﻮﻝ ﻣﻲ ﺑﺎﻳﺴﺖ ﭘﻨﺞ ﻗﺴﻤﺖ ﺭﺍ ﺑﻪ ﺻﻮﺭﺕ ﺻﺮﻳﺢ ﺗﻌﺮﻳﻒ ﮎﺭﺩ :
ﻭﻟﻲ ﺑﺮﺍﻱ ﺗﻌﺮﻳﻒ ﻋﺒﺎﺭﺕ ﻻﻣﺒﺪﺍ ﻓﻖﻁ ﺩﻭ ﻣﺮﺣﻠﻪ ﺍﺯ ﻣﺮﺍﺣﻞ ﺗﻌﺮﻳﻒ ﺗﺎﺑﻊ ﺭﺍ ﺍﻧﺠﺎﻡ ﻣﻲ ﺩﻫﻴﻢ.
2
Expression Tree
www.AliAghdam.ir ﺻﻔﺤﻪ | 15ﻓﺼﻞ ﺩﻭﻡ – ﺧﺼﻮﺻﻴﺎﺕ ﺟﺪﻳﺪ C#ﺑﺮﺍﻱ LINQ
ﻗﺴﻤﺖ ﺍﻭﻝ ﻋﺒﺎﺭﺕ ﻻﻣﺒﺪﺍ ) ﻋﺒﺎﺭﺕ ﺩﺍﺧﻞ ﭘﺮﺍﻧﺘﺰ( ﺑﻪ ﻋﻨﻮﺍﻥ ﺁﺭﮔﻮﻣﺎﻥ ﻫﺎﻱ ﺗﺎﺑﻊ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮﻧﺪ ﻭ ﺍﮔﺮ ﻋﺒﺎﺭﺕ
ﻻﻣﺒﺪﺍﻱ ﻣﻮﺭﺩ ﻧﻈﺮ ﺷﻤﺎ ﻓﺎﻗﺪ ﺁﺭﮔﻮﻣﺎﻥ ﺑﺎﺷﺪ ﻣﻲ ﺗﻮﺍﻧﻴﺪ ﺍﺯ ﺍﻳﻦ ﻗﺴﻤﺖ ﺻﺮﻑ ﻧﻈﺮ ﮐﻨﻴﺪ.
ﻗﺴﻤﺖ ﺩﻭﻡ ﻳﻌﻨﻲ>= ﺑﻪ ﮐﺎﻣﭙﺎﻳﻠﺮ ﺍﻋﻼﻡ ﻣﻲ ﮐﻨﺪ ﮐﻪ ﺍﻳﻦ ﻋﺒﺎﺭﺕ ﻳﮏ ﻋﺒﺎﺭﺕ ﻻﻣﺒﺪﺍ ﺍﺳﺖ ﻭ ﻗﺴﻤﺖ ﺳﻮﻡ ﺑﺪﻧﻪ ﺗﺎﺑﻊ ﺭﺍ ﻧﺸﺎﻥ
ﻣﻲ ﺩﻫﺪ ﮐﻪ ﺩﺭ ﺍﻳﻦ ﻋﺒﺎﺭﺕ ﺑﺪﻧﻪ ﺳﺎﺩﻩ ﺍﺳﺖ ﻭﻟﻲ ﺍﮔﺮ ﺷﻤﺎ ﺧﻮﺍﺳﺘﻴﺪ ﺑﺪﻧﻪ ﺑﻴﺸﺘﺮ ﺭﺍ ﺩﺭ ﻋﺒﺎﺭﺕ ﺧﻮﺩ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻣﻲ ﺑﺎﻳﺴﺖ
ﺩﺳﺘﻮﺭﺍﺕ ﺩﺭﻭﻥ braseﻗﺮﺍﺭ ﺩﻫﻴﺪ ﻭ ﺁﻧﻬﺎ ﺭﺍ ﺑﺎ ﺳﻤﻲ ﮐﻮﻟﻮﻥ ﺟﺪﺍ ﮐﻨﻴﺪ.
ﺑﻴﺸﺘﺮ ﺑﺪﺍﻧﻴﻢ
ﺩﺭ ﻫﻨﮕﺎﻡ ﮐﺎﻣﭙﺎﻳﻞ ﺷﺪﻥ ﻋﺒﺎﺭﺕ ﻻﻣﺒﺪﺍ ،ﮐﺎﻣﭙﺎﻳﻠﺮ ﺁﻥ ﻋﺒﺎﺭﺕ ﺭﺍ ﺑﻪ ﻋﻨﻮﺍﻥ Delegateﺩﺭ ﻧﻈﺮ ﻣﻲ ﮔﻴﺮﺩ ﻭ ﭘﻴﺎﺩﻩ
ﺳﺎﺯﻱ ﺁﻥ ﺭﺍ ﺩﺭ ﮐﻼﺱ ﺟﺎﺭﻱ ﻗﺮﺍﺭ ﻣﻲ ﺩﻫﺪ ﻭ ﻧﻮﻉ ﺩﺳﺘﺮﺳﻲ ﺑﻪ ﺗﺎﺑﻊ ﻣﻮﺭﺩ ﻧﻈﺮ ﺧﺼﻮﺻﻲ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮﺩ .ﺑﻪ ﺍﻳﻦ ﻫﺎ
ﺗﻮﺍﺑﻊ ﺑﻲ ﻧﺎﻡ ϯﺍﻃﻼﻕ ﻣﻲ ﮔﺮﺩﺩ ﭼﻮﻥ ﻧﺎﻡ ﺗﺎﺑﻊ ﺗﻮﺳﻂ ﮐﺎﻣﭙﺎﻳﻞ ﺍﻧﺘﺨﺎﺏ ﻣﻲ ﮔﺮﺩﺩ ﻭ ﻫﻴﭻ ﻗﺎﻧﻮﻥ ﻣﺸﺨﺼﻲ ﺑﺮﺍﻱ ﺁﻥ ﻭﺟﻮﺩ
ﻧﺪﺍﺭﺩ ﻳﻌﻨﻲ ﺑﺎ ﭼﻨﺪ ﺑﺎﺭ ﮐﺎﻣﭙﺎﻳﻞ ﻳﮏ ﮐﺪ ،ﭼﻨﺪﻳﻦ ﻧﺎﻡ ﻣﺨﺘﻠﻒ ﺑﻪ ﺁﻥ ﻧﺴﺒﺖ ﺩﺍﺩﻩ ﻣﻲ ﺷﻮﺩ.
ﻧﺎﻡ ﺍﻳﻦ ﺗﺎﺑﻊ ﺑﺎ ﻋﻼﻣﺖ " < " ﺷﺮﻭﻉ ﻣﻲ ﺷﻮﺩ ﭼﻮﻥ ﺷﻤﺎ ﻫﻴﭻ ﻣﻮﻗﻊ ﻧﻤﻲ ﺗﻮﺍﻧﻴﺪ ﺍﺩﻋﺎ ﮐﻨﻴﺪ ﮐﻪ ﺗﺎﺑﻌﻲ ﻧﻮﺷﺘﻪ ﺍﻳﺪ ﮐﻪ ﺑﺎ ﺍﻳﻦ
ﻋﻼﻣﺖ ﺭﺍ ﺷﺮﻭﻉ ﻣﻲ ﺷﻮﺩ! ﭘﺲ ﮐﺎﻣﭙﺎﻳﻠﺮ ﺍﺯ ﺍﻳﻦ ﺭﺍﻩ ﺁﻧﻬﺎ ﺭﺍ ﺗﺸﺨﻴﺺ ﻣﻲ ﺩﻫﺪ ﻫﻤﭽﻨﻴﻦ ﮐﺎﻣﭙﺎﻳﻠﺮ ﻳﮏ ﺧﺼﻴﺼﻪ
System.Runtime.CompilerServices.CompilerGeneratedAttributeﻧﻴﺰ ﺑﻪ ﺗﺎﺑﻊ ﺍﺿﺎﻓﻪ ﻣﻲ ﮐﻨﺪ ﺗﺎ ﺩﭼﺎﺭ
ﺍﺷﺘﺒﺎﻩ ﻧﺸﻮﺩ.ﺑﻪ ﻋﺒﺎﺭﺕ ﺯﻳﺮ ﺩﻗﺖ ﮐﻨﻴﺪ
internal sealed class AClass
{
)(public static void CallbackWithoutNewingADelegateObject
{
;)ThreadPool.QueueUserWorkItem(obj => Console.WriteLine(obj), 5
}
}
ﻋﺒﺎﺭﺕ ﺑﺎﻻ ﺑﻌﺪ ﺍﺯ ﮐﺎﻣﭙﺎﻳﻞ ﺑﻪ ﮐﺪ ، ILﺑﻪ ﻋﺒﺎﺭﺍﺕ ﺻﺨﻴﻢ ﺷﺪﻩ ﺩﻗﺖ ﮐﻨﻴﺪ
{ internal sealed class AClass
3
anonymous function
ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ | LINQﺻﻔﺤﻪ16 www.AliAghdam.ir
ThreadPool.QueueUserWorkItem(<>9__CachedAnonymousMethodDeleg
;)ate1, 5
}
][CompilerGenerated
private static void
{ )<CallbackWithoutNewingADelegateObject>b__0(Object obj
;)Console.WriteLine(obj
}
}
ﺍﮔﺮ ﺩﻗﺖ ﮐﺮﺩﻩ ﺑﺎﺷﻴﺪ ﺩﺭ ﺍﺳﺘﻔﺎﺩﻩ ﻫﺎﻱ ﻣﻌﻤﻮﻝ ﻋﺒﺎﺭﺕ ﻻﻣﺒﺪﺍ ﻗﺼﺪ ﺩﺍﺭﺩ ﺗﺎ ﻳﮏ ﺳﻄﺢ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺭﺍ ﮐﻢ ﮐﻨﺪ ﻭ ﺧﻮﺩ
ﺍﻳﻦ ﻣﺴﺌﻮﻟﻴﺖ ﺭﺍ ﺑﻪ ﺩﻭﺵ ﺑﮑﺸﺪ )ﺍﻟﺒﺘﻪ ﮐﺎﻣﭙﺎﻳﻠﺮ(.
ﺩﺭ ﻫﻨﮕﺎﻡ ﺗﻌﺎﻣﻞ ﺑﺎ ﭘﺎﻳﮕﺎﻩ ﻫﺎﻱ ﺩﺍﺩﻩ ﺩﺭ ﻭﺍﻗﻊ ﻣﺎ ﺍﺯ ﺩﻭ ﺯﺑﺎﻥ ﺑﺮﺍﻱ ﺍﻳﻦ ﺗﻌﺎﻣﻞ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﮐﻨﻴﻢ ﻧﺨﺴﺘﻴﻦ ﺯﺑﺎﻥ ،ﺯﺑﺎﻥ
ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺎ ﺍﺳﺖ )ﻣﺜﻼ (C#ﻭ ﺩﻳﮕﺮﻱ ﺯﺑﺎﻧﻲ ﮐﻪ ﺑﺎ ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﺍﺭﺗﺒﺎﻁ ﺑﺮﻗﺮﺍﺭ ﻣﻲ ﮐﻨﻴﻢ )ﻣﺜﻼ .(SQLﺑﺮﺍﻱ ﺍﻳﻨﮑﻪ
ﺑﺘﻮﺍﻧﻴﻢ ﺑﺎ ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﺍﺭﺗﺒﺎﻁ ﺑﺮﻗﺮﺍﺭ ﮐﻨﻴﻢ ﻋﺒﺎﺭﺕ SQLﺭﺍ ﺩﺭ ﻗﺎﻟﺐ ﻣﺘﻦ ﺑﻪ ﺳﻴﺴﺘﻢ ﻣﻴﺎﻣﻨﺠﻲ ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﺍﺭﺳﺎﻝ ﻣﻲ ﮐﻨﻴﻢ
ﮐﻪ ﺗﺎ ﺯﻣﺎﻥ ﺍﺟﺮﺍ ﻧﺸﺪﻥ ﮐﺪ ﻧﻤﻲ ﺗﻮﺍﻧﻴﻢ ﺍﺯ ﺻﺤﺖ ﺍﻳﻦ ﻋﺒﺎﺭﺕ ﻣﻄﻠﻊ ﺷﻮﻳﻢ.
ﺩﺭ C# 3.0ﺗﮑﻨﻮﻟﻮﮊﻱ LINQﻣﺎ ﺭﺍ ﺍﺯ ﻭﺍﺑﺴﺘﻪ ﺑﻮﺩﻥ ﺑﻪ ﻋﺒﺎﺭﺍﺕ SQLﻣﺘﻨﻲ ﺭﻫﺎ ﺳﺎﺧﺖ ﻭ ﺑﻮﺳﻴﻠﻪ ﻋﺒﺎﺭﺍﺕ ﭘﺮﺱ ﻭ ﺟﻮ
ﻗﺎﺑﻠﻴﺖ ﻧﻮﺷﺘﻦ ﻋﺒﺎﺭﺍﺗﻲ ﻧﺰﺩﻳﮏ ﺑﻪ ﻋﺒﺎﺭﺍﺕ SQLﺑﺎ ﻗﺎﺑﻠﻴﺖ Language-Levelﺭﺍ ﻓﺮﺍﻫﻢ ﻣﻲ ﮐﻨﺪ.
ﻋﺒﺎﺭﺍﺕ ﭘﺮﺱ ﻭ ﺟﻮ ﺑﺎ ﺟﺮﺀ fromﺷﺮﻭﻉ ﻭ ﺑﺎ selectﻭ ﻳﺎ groupﺑﻪ ﭘﺎﻳﺎﻥ ﻣﻲ ﺭﺳﺪ.ﺟﺰﺀ fromﻣﻲ ﺗﻮﺍﻧﺪ ﺑﺎ ﺟﺰﺀ
ﻫﺎﻱ let ¡ fromﻭ whereﺍﺩﺍﻣﻪ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ .ﺟﺰﺀ fromﻧﻘﺶ ﺳﺎﺯﻧﺪﻩ let،ﻧﻘﺶ ﻣﺤﺎﺳﺒﻪ ﮔﺮ ﻣﻘﺪﺍﺭ select ،
www.AliAghdam.ir LINQ ﺑﺮﺍﻱC# | ﻓﺼﻞ ﺩﻭﻡ – ﺧﺼﻮﺻﻴﺎﺕ ﺟﺪﻳﺪ17 ﺻﻔﺤﻪ
ﺟﺰﺀ ﻫﺎﻱ ﺩﻳﮕﺮ ﻧﻴﺰ ﻭﺟﻮﺩ ﺩﺍﺭﻧﺪ ﮐﻪ ﺩﺭ. ﻧﻘﺶ ﻓﻴﻠﺘﺮ ﺭﺍ ﺍﻳﻔﺎ ﻣﻲ ﮐﻨﻨﺪwhere ﻧﻘﺶ ﺷﮑﻞ ﺩﺍﺩﻥ ﺑﻪ ﻧﺘﺎﻳﺞ ﻭgroup ﻭ
.ﻓﺼﻞ ﺑﻌﺪﻱ ﺑﻪ ﺗﻔﻀﻴﺎ ﺁﻧﻬﺎ ﺭﺍ ﺷﺮﺡ ﺧﻮﺍﻫﻴﻢ ﺩﺍﺩ
from-clause:
from typeopt identifier in expression join-clausesopt
join-clauses:
join-clause
join-clauses join-clause
join-clause:
join typeopt identifier in expression on expression equals expression
join typeopt identifier in expression on expression equals expression
into identifier
query-body:
from-let-where-clausesopt orderby-clauseopt select-or-group-clause query-
continuationopt
from-let-where-clauses:
from-let-where-clause
from-let-where-clauses from-let-where-clause
from-let-where-clause:
from-clause
let-clause
where-clause
let-clause:
let identifier = expression
where-clause:
where boolean-expression
orderby-clause:
orderby orderings
orderings:
18 |ﺻﻔﺤﻪLINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
ordering
orderings , ordering
ordering:
expression ordering-directionopt
ordering-direction:
ascending
descending
select-or-group-clause:
select-clause
group-clause
select-clause:
select expression
group-clause:
group expression by expression
query-continuation:
into identifier join-clausesopt query-body
ﺩﺭ ﻭﺍﻗﻊ ﺍﻳﻦ ﻋﺒﺎﺭﺍﺕ ﺩﺭ ﻫﻨﮕﺎﻡ ﮐﺎﻣﭙﺎﻳﻞ ﺑﻪ ﺷﮑﻞ ﻣﺘﺪﻱ ﺧﻮﺩ ﺑﻪ ﻭﺳﻴﻠﻪ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺗﺒﺪﻳﻞ ﻣﻲ ﮔﺮﺩﻧﺪ ﻭ ﺷﻤﺎ ﻧﻴﺰ ﻣﻲ
ﻋﺒﺎﺭﺕ ﭘﺮﺱ ﻭ ﺟﻮﻱ ﺯﻳﺮ ﺭﺍ ﺩﺭ ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ.ﺗﻮﺍﻧﻴﺪ ﺑﻪ ﺻﻮﺭﺕ ﻣﺴﺘﻘﻴﻢ ﺷﮑﻞ ﻣﺘﺪﻱ ﻋﺒﺎﺭﺕ ﭘﺮﺱ ﻭ ﺟﻮ ﺭﺍ ﺑﻨﻮﻳﺴﻴﺪ
3 ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭﺟﻮ API ϭﺍﻱ ﺍﺳﺖ ﮐﻪ ﺍﻣﮑﺎﻥ ﺍﻧﺠﺎﻡ ﭘﺮﺱ ﻭ ﺟﻮ ﺭﺍ ﺑﺮ ﺭﻭﻱ ﺁﺭﺍﻳﻪ ﻫﺎ ﻭ
ﻣﺠﻤﻮﻋﻪ ﻫﺎ ﻭ ﺍﻧﻮﺍﻉ ﻣﻨﺎﺑﻊ ﺩﺍﺩﻩ ﺭﺍ ﻓﺮﺍﻫﻢ ﻣﻲ ﮐﻨﺪ.
ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭﺟﻮ ﺩﺭ ﻭﺍﻗﻊ ﺗﻮﺍﺑﻌﻲ ﻫﺴﺘﻨﺪﮐﻪ ﺩﺭﮐﻼﺱ ﻫﺎﻱ ﺍﻳﺴﺘﺎﻱ ﻣﻮﺟﻮﺩ ﺩﺭ ﻓﻀﺎﻱ ﻧﺎﻡ
System.Linqﻭ ﺑﻪ ﻋﻨﻮﺍﻥ ﻣﺘﺪﻫﺎﻱ ﺗﻮﺳﻌﻪ ﺑﺎ ﻣﺪﻝ ﻫﺎﻱ ﻣﺨﺘﻠﻔﻲ ﺗﻌﺮﻳﻒ ﺷﺪﻩ ﺍﻧﺪ .ﺍﻳﻦ ﺗﻮﺍﺑﻊ ﺩﺭ ﺍﺳﻤﺒﻠﻲ
System.Core.dllﻗﺮﺍﺭ ﺩﺍﺭﻧﺪ ¡ ﻭ ﺍﺯ ﺁﻥﻫﺎ ﺩﺭ ﻫﺮ ﺯﺑﺎﻥ ﺗﺤﺖ ﺩﺍﺕ ﻧﺘﻲ ﮐﻪ Genericﻫﺎ ﻭ ﻭﻳﮋﮔﻲ ﻫﺎﻱ ﺟﺪﻳﺪ ﺩﺍﺕ ﻧﺖ
>IEnumerable<Tﻭ
ﺭﺍ ﭘﺸﺘﻴﺒﺎﻧﻲ ﮐﻨﺪ¡ ﻣﻲ ﺗﻮﺍﻥ ﺍﺳﺘﻔﺎﺩﻩ ﻧﻤﻮﺩ.
1
Standard Query Operators
www.AliAghdam.ir ﺻﻔﺤﻪ | 21ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ
ﺩﺭ ﺯﻳﺮ ﻟﻴﺴﺘﻲ ﺍﺯ ﺍﻧﻮﺍﻉ ﺍﻳﻦ ﻋﻤﻠﮕﺮﻫﺎ ﺁﻣﺪﻩ ﺍﺳﺖ ﮐﻪ ﺍﺩﺍﻣﻪ ﻫﺮ ﮐﺪﺍﻡ ﺭﺍ ﺑﻪ ﻃﻮﺭ ﮐﺎﻣﻞ ﺗﻮﺿﻴﺢ ﺧﻮﺍﻫﻢ ﺩﺍﺩ.
ﺍﮔﺮ ﻣﺠﻤﻮﻋﻪ ﻣﺸﺨﺺ ﺷﺪﻩ ﺗﻬﻲ ﺑﺎﺷﺪ ،ﻳﮏ ﻣﻘﺪﺍﺭ ﭘﻴﺶ ﻓﺮﺽ ﺑﻪ
DefaultIfEmpty
ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﮐﻨﺪ.
ﻋﻤﻠﮕﺮ Where
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻧﺘﻴﺠﻪ ﭘﺮﺱ ﻭﺟﻮ ﺭﺍ ﺑﺮ ﺍﺳﺎﺱ ﺁﺭﮔﻮﻣﺎﻥ ﻭﺭﻭﺩﻱ )ﺑﻪ ﻋﻨﻮﺍﻥ ﺷﺮﻁ( ﻣﺤﺪﻭﺩ ﻣﻲ ﮐﻨﺪ .ﻓﺮﻡ ﮐﻠﻲ ﻧﻮﺷﺘﺎﺭ ﺍﻳﻦ
ﻋﻤﻠﮕﺮ ﺑﻪ ﺩﻭ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ :
ﺗﻔﺎﻭﺕ ﺍﻳﻦ ﺩﻭ ﻓﺮﻡ ﺍﺯ ﻋﻤﻠﮕﺮ Whereﺗﻨﻬﺎ ﺩﺭ ﭘﺎﺭﺍﻣﺘﺮ ﺩﻭﻡ ﺁﻧﻬﺎ ﺍﺳﺖ ﺍﻳﻦ ﭘﺎﺭﺍﻣﺘﺮ ﻫﻤﺎﻥ ﺷﺮﻃﻲ ﺍﺳﺖ ﮐﻪ ﻫﺮ ﻋﻨﺼﺮ ﺩﺭ
ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺑﺎ ﺁﻥ ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﮔﺮﺩﺩ .ﺩﺭ ﻓﺮﻡ ﺩﻭﻡ ﻋﻤﻠﮕﺮ Whereﻳﮏ ﭘﺎﺭﺍﻣﺘﺮ ﺍﺯ ﻧﻮﻉ intﻭﺟﻮﺩ ﺩﺍﺭﺩ ﮐﻪ ﻧﺸﺎﻥ ﺩﻫﻨﺪﻩ
ﺍﻧﺪﻳﺲ ﻫﺮ ﻋﻀﻮ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺍﺳﺖ ﮐﻪ ﺻﻔﺮ ﺷﺮﻭﻉ ﻣﻲ ﺷﻮﺩ.
ﻣﺜﺎﻝ :1ﺩﺭ ﭘﺮﺱ ﻭ ﺟﻮﻱ ﺯﻳﺮ ﺍﺟﻨﺎﺳﻲ ﮐﻪ ﻗﻴﻤﺖ ﺁﻧﻬﺎ ﺑﻴﺸﺘﺮ ﺍﺯ 10ﺑﺎﺷﺪ ﺑﻪ ﻋﻨﻮﺍﻥ ﺧﺮﻭﺟﻲ ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ ﺷﻮﺩ.
ﻭﻗﺘﻲ ﭘﺮﺱ ﻭﺟﻮﻱ ﻗﺒﻞ ﮐﺎﻣﭙﺎﻳﻞ ﻡﻱ ﮔﺮﺩﺩ ﺑﻪ ﻣﻌﺎﺩﻝ ﺗﻮﺍﺑﻊ ﺍﻟﺤﺎﻗﻲ ﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮﺩ ﻭ ﺩﺭ ﻭﺍﻗﻊ ﺗﻮﺍﺑﻊ ﺍﻟﺤﺎﻗﻲ ﻫﺴﺘﻨﺪ ﻭﻟﻲ
ﺑﺮﺍﻱ ﺍﻳﻨﮑﻪ ﺑﺘﻮﺍﻥ ﺍﺯ ﻓﺮﻡ ﭘﺮﺱ ﻭﺟﻮﻱ ﺷﺒﻴﻪ ﺑﻪ ﻧﻮﺷﺘﺎﺭ SQLﺍﺳﺘﻔﺎﺩﻩ ﮎﺭﺩ ﺑﻪ ﺍﻳﻦ ﺻﻮﺭﺕ ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮﻧﺪ ﮐﻪ ﻣﻲ ﺗﻮﺍﻥ ﺍﺯ
ﮎﺩ .ﺑﻪ ﻋﻨﻮﺍﻥ ﻣﺜﺎﻝ ﻋﺒﺎﺭﺕ ﭘﺮﺱ ﻭ ﺟﻮ ﺑﺎﻻ ﺩﺭ ﻫﻨﮕﺎﻡ ﮐﺎﻣﭙﺎﻳﻞ ﺑﻪ ﻋﺒﺎﺭﺕ
ﻫﺮ ﺩﻭ ﻓﺮﻡ ﺏﺭﺍﻱ ﻧﻮﺷﺘﻦ ﭘﺮﺱ ﻭﺟﻮ ﻫﺎ ﺍﺳﺘﻔﺎﺩﻩ ﺭ
ﺯﻳﺮ ﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮﻧﺪ ،ﺑﻪ ﻧﺤﻮﻩ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﻭ ﻋﺒﺎﺭﺍﺕ ﻻﻣﺒﺪﺍ ﺗﻮﺟﻪ ﮐﻨﻴﺪ .
ﻣﺜﺎﻝ :2ﺩﺭ ﺑﺮﻧﺎﻣﻪ ﺯﻳﺮ ﺍﺯ ﻧﻮﻉ ﺩﻭﻡ ﻋﻤﻠﮕﺮ ﺍﺳﺘﻔﺎﺩﻩ ﺷﺪﻩ ﺍﺳﺖ .ﺩﺭ ﺍﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺧﺮﻳﺪﺍﺭﺍﻧﻲ ﮐﻪ ﮐﺪ ﺍﻳﻨﺪﮐﺲ ﺁﻧﻬﺎ ﺑﺎ ﮐﺪ IDﺷﺎﻥ
ﺑﺮﺍﺑﺮ ﺑﺎﺷﺪ ،ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ ﺷﻮﻧﺪ.
ﻋﻤﻠﮕﺮ OfType
ﻋﻤﻠﮕﺮ OfTypeﺍﻋﻀﺎﺀ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺮﺣﺴﺐ ﻳﮏ ﻧﻮﻉ ﻣﺸﺨﺺ ﻓﻴﻠﺘﺮ ﻣﻲ ﮐﻨﺪ ﻭ ﻓﻘﻂ ﻋﻨﺎﺻﺮﻱ ﮐﻪ ﺍﺯ ﺁﻥ ﻧﻮﻉ
ﺑﺎﺷﻨﺪ ﺩﺭ ﻧﺘﻴﺠﻪ ﭘﺮﺱ ﻭ ﺟﻮ ﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﻧﺪ .ﻓﺮﻡ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ :
if (item is T)
yield return (T)item;
}
T ﺗﮏ ﺗﮏ ﺑﺮﺭﺳﻲ ﻣﻲ ﺷﻮﻧﺪ ﻭ ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﺑﺎ ﻧﻮﻉsource ﻫﻤﺎﻧﻄﻮﺭ ﮐﻪ ﺍﺯ ﻓﺮﻡ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﻌﻠﻮﻡ ﺍﺳﺖ ﺍﻋﻀﺎﻱ
.ﻣﻄﺎﺑﻘﺖ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻨﺪ ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ ﺷﻮﻧﺪ
ﻫﺴﺘﻨﺪ ﺭﺍCustomer ﺩﺭ ﺑﺮﻧﺎﻣﻪ ﺯﻳﺮ ﻣﻲ ﺧﻮﺍﻫﻴﻢ ﺍﺯ ﺑﻴﻦ ﺍﻧﻮﺍﻉ ﻣﺨﺘﻠﻒ ﺩﺭﻭﻥ ﻟﻴﺴﺖ ﻓﻘﻂ ﻋﻨﺎﺻﺮﻱ ﮐﻪ ﺍﺯ ﻧﻮﻉ:ﻣﺜﺎﻝ
.ﺍﻧﺘﺨﺎﺏ ﮐﻨﻴﻢ
//using System.Collections
. ﺭﺍ ﻧﻤﺎﻳﺶ ﻣﻲ ﺩﻫﺪOfType ﻣﺜﺎﻝ ﺑﺎﻻ ﺑﻪ ﺻﻮﺭﺕ ﮐﺎﻣﻼ ﺩﻗﻴﻖ ﻧﺤﻮﻩ ﮐﺎﺭﮐﺮﺩ ﻋﻤﻠﮕﺮ
Select ﻋﻤﻠﮕﺮ
ﻓﺮﻡ ﮐﻠﻲ. ﺷﺊ ﺟﺪﻳﺪ ﻭ ﻗﺎﺑﻞ ﺷﻤﺎﺭﺷﻲ ﺍﻳﺠﺎﺩ ﮐﺮﺩﻩ ﻭ ﺁﻥ ﺭﺍ ﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ، ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﺯ ﺭﻭﻱ ﺁﺭﮔﻮﻣﺎﻥ ﻫﺎﻱ ﻭﺭﻭﺩﻱ
: ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ
ﺗﻔﺎﻭﺕ ﺩﻭ ﻓﺮﻡ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ ﭘﺎﺭﺍﻣﺘﺮ ﺩﻭﻡ ﺁﻧﻬﺎ ﺍﺳﺖ ﮐﻪ ﻧﻮﻉ ﺩﻭﻡ ﻳﮏ. ﺍﺳﺖSQL ﺩﺭSelect ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻫﻤﺎﻧﻨﺪ ﻣﺎﺩﻩ
.ﺍﻧﺪﻳﺲ )ﺷﺮﻭﻉ ﺍﺯ ﺻﻔﺮ ( ﮐﻪ ﻧﺸﺎﻥ ﺩﻫﻨﺪﻩ ﻣﺤﻞ ﻫﺮ ﻋﻨﺼﺮ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺍﺳﺖ ﺭﺍ ﺩﺭﻳﺎﻓﺖ ﻣﻲ ﮐﻨﺪ
(SQL ﺩﺭSELECT * ﺩﺭ ﺑﺮﻧﺎﻣﻪ ﺯﻳﺮ ﻋﺒﺎﺭﺕ ﭘﺮﺱ ﻭ ﺟﻮ ﻫﻤﻪ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ )ﻣﻌﺎﺩﻝ: 1 ﻣﺜﺎﻝ
ﺩﺭ ﺑﺮﻧﺎﻣﻪ ﺯﻳﺮ ﻋﺒﺎﺭﺕ ﭘﺮﺱ ﻭ ﺟﻮ ﻫﻤﻪ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺑﻪ ﻫﻤﺮﺍﻩ ﺍﻧﺪﻳﺲ ﻋﻨﺎﺻﺮ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ: 2 ﻣﺜﺎﻝ
( Select )ﻓﺮﻡ ﺩﻭﻡ ﻋﻤﻠﮕﺮ.ﺷﻮﻧﺪ
SelectMany ﻋﻤﻠﮕﺮ
ﺍﺳﺖ ﺑﺎ ﺍﻳﻦ ﺗﻔﺎﻭﺕ ﮐﻪ ﻣﻲ ﺗﻮﺍﻥ ﺍﺯ ﻧﺘﻴﺠﻪ ﭘﺮﺱ ﻭ ﺟﻮﻱ ﻗﺒﻠﻲ ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩSelect ﻋﻤﻠﮑﺮﺩ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻠﮕﺮ
: ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺍﺭﺍﻱ ﺩﻭ ﻓﺮﻡ ﮐﻠﻲ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ. ﺍﺳﺖSQL ﺩﺭjoin ﮐﻪ ﺩﺭ ﻭﺍﻗﻊ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻠﮑﺮﺩ ﻣﺎﺩﻩ
ﻫﻤﺎﻧﻄﻮﺭ ﮐﻪ ﺩﺭ ﺑﺎﻻ ﮔﻔﺘﻪ ﺷﺪ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﻳﻦ ﻗﺎﺑﻠﻴﺖ ﺭﺍ ﻓﺮﺍﻫﻢ ﻣﻴﮑﻨﺪ ﮐﻪ ﺍﺯ ﻧﺘﻴﺠﻪ ﭘﺮﺱ ﻭ ﺟﻮﻫﺎﻱ ﻗﺒﻠﻲ ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ
Selector ﺑﻮﺳﻴﻠﻪ ﭘﺎﺭﺍﻣﺘﺮ ﺩﻭﻡ ﻳﻌﻨﻲ IEnumerable<S> ﮐﻪ ﺍﻳﻦ ﺍﻣﮑﺎﻥ ﺭﺍ ﺑﻮﺳﻴﻠﻪ ﺑﺮﮔﺮﺩﺍﻧﺪﻥ ﻧﺘﻴﺠﻪ ﭘﺮﺱ ﻭ ﺟﻮ ﺍﺯ ﻧﻮﻉ
.ﺑﻮﺟﻮﺩ ﻣﻲ ﺁﻳﺪ
ﺭﺍ ﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ ﻭ ﻓﺮﻡ ﺩﻭﻡ ﺑﺮﺍﻱIEnumerable<S> ﺗﻔﺎﻭﺕ ﺍﻳﻦ ﺩﻭ ﻓﺮﻡ ﺩﺭ ﭘﺎﺭﺍﻣﺘﺮ ﺩﻭﻡ ﺍﺳﺖ ﮐﻪ ﻓﺮﻡ ﺍﻭﻝ ﻳﮏ ﻧﻮﻉ
. ﻧﻴﺎﺯ ﺩﺍﺭﺩ،ﺑﺮﮔﺮﺩﺍﻧﺪﻥ ﻧﺘﻴﺠﻪ ﻧﻴﺎﺯ ﺑﻪ ﻳﮏ ﺍﻧﺪﻳﺲ ﺑﺮﺍﻱ ﻣﺸﺨﺺ ﺷﺪﻥ ﻣﺤﻞ ﻋﻨﺼﺮ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺍﺳﺖ
. ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ ﺷﻮﺩ، ﺍﻧﺠﺎﻡ ﮔﺮﻓﺘﻪ2010 ﮐﻪ ﺑﻌﺪ ﺍﺯ ﺳﺎﻝAghdam ﺩﺭ ﺑﺮﻧﺎﻣﻪ ﺯﻳﺮ ﺳﻔﺎﺭﺵ ﻫﺎﻱ ﻣﺸﺘﺮﻱ ﺑﻪ ﻧﺎﻡ:ﻣﺜﺎﻝ
customers[0].Orders = order1;
: ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖC# 3.0 ﻣﻌﺪﻝ ﻋﺒﺎﺭﺕ ﭘﺮﺱ ﻭ ﺟﻮﻱ ﺑﺎﻻ ﺑﻮﺳﻴﻠﻪ ﻋﺒﺎﺭﺍﺕ ﭘﺮﺱ ﻭ ﺟﻮ ﺩﺭ
ﻋﻤﻠﮕﺮ Join
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻫﻤﺎﻧﻨﺪ INNER Joinﺩﺭ ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﻫﺎﻱ ﺭﺍﺑﻄﻪ ﺍﻱ ﻋﻤﻞ ﻣﻲ ﮐﻨﺪ ﻳﻌﻨﻲ ﺩﻭ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺮ ﺍﺳﺎﺱ ﮐﻠﻴﺪﻫﺎﻱ
ﮐﻪ ﺩﺭ ﻫﺮ ﺩﻭ ﻣﺮﺗﺒﻂ ﻫﺴﺘﻨﺪ ﻭ ﺑﻪ ﻋﻨﻮﺍﻥ ﺁﺭﮔﻮﻣﺎﻥ ﺑﻪ ﺁﻥ ﺍﺭﺳﺎﻝ ﻣﻲ ﮔﺮﺩ ﻥﺩ ،ﺗﺮﮐﻴﺐ ﻣﻲ ﮐﻨﺪ .ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﻓﺮﻡ ﺯﻳﺮ
ﺍﺳﺖ)ﺑﺪﻭﻥ ﺳﺮﺑﺎﺭﮔﺬﺍﺭﻱ(:
ﭘﺎﺭﺍﻣﺘﺮ Outerﻧﺸﺎﻥ ﺩﻫﻨﺪﻩ ﻧﻮﻉ ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﺧﺎﺭﺟﻲ ﻭ ﭘﺎﺭﺍﻣﺘﺮ innerﻧﺸﺎﻥ ﺩﻫﻨﺪﻩ ﻧﻮﻉ ﻣﻨﺒﻊ ﺩﺍﺩﻩ ﺩﺍﺧﻠﻲ ﺍﺳﺖ .
innerﻭ outer ﭘﺎﺭﺍﻣﺘﺮﻫﺎﻱ outerKeySelectorﻭ innerKeySelectorﺗﻌﻴﻴﻦ ﻣﻲ ﮐﻨﻨﺪ ﮐﻪ ﺩﺍﺩﻩ ﻫﺎ ﭼﻄﻮﺭ ﺍﺯ ﻣﻨﺎﺑﻊ
Joinﺭﺍ ﭘﺪﻳﺪ ﻣﻲ ﺁﻭﺭﺩ .ﺗﺎﺑﻊ ﺍﺳﺘﺨﺮﺍﺝ ﮔﺮﺩﻧﺪ .ﻧﻮﻉ ﺩﻭﻡ ﻫﺮﺩﻭ ﺁﻧﻬﺎ ﺍﺯ ﻧﻮﻉ Kﻣﻲ ﺑﺎﺷﻨﺪ ﮐﻪ ﺗﻌﺎﺩﻝ ﻣﻴﺎﻥ ﺍﻳﻦ ﺩﻭ ،ﺷﺮﻁ
resultSelectorﮐﻪ ﺑﻪ ﻋﻨﻮﺍﻥ ﺁﺧﺮﻳﻦ ﭘﺎﺭﺍﻣﺘﺮ ﺗﻌﻴﻴﻦ ﺷﺪﻩ ﺍﺳﺖ ﺑﺮﺍﻱ ﺟﻔﺖ ﻋﻨﺎﺻﺮ ﺩﺍﺧﻠﻲ ﻭ ﺧﺎﺭﺟﻲ )ﺗﻄﺎﺑﻖ ﺩﺍﺩﻩ ﺷﺪﻩ(
ﺑﺮﺭﺳﻲ ﺷﺪﻩ ﻭ ﺷﺊ ﻧﺘﻴﺠﻪ ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ ﺷﻮﺩ.
ﻋﻤﻠﮕﺮ Joinﺗﺮﺗﻴﺐ ﻋﻨﺎﺻﺮ ﺧﺎﺭﺟﻲ ﺭﺍ ﺣﻔﻂ ﻣﻴﮑﻨﺪ ﻭ ﻫﻤﭽﻨﻴﻦ ﺑﺮﺍﻱ ﻫﺮ ﻋﻨﺼﺮ ﺧﺎﺭﺟﻲ ،ﺗﺮﺗﻴﺐ ﻋﻨﺎﺻﺮ ﺗﻄﺒﻴﻖ ﺩﺍﺩﻩ ﺷﺪﻩ
ﺩﺍﺧﻠﻲ ﺭﺍ ﻧﻴﺰ ﺣﻔﻆ ﻣﻴﮑﻨﺪ.
ﺩﺭ ﭘﺎﻳﮕﺎﻩ ﺩﺍﺩﻩ ﻫﺎﻱ ﺭﺍﺑﻄﻪ ﺍﻱ ﻋﻤﻠﮕﺮﻫﺎﻱ Joinﺩﻳﮕﺮﻱ ﻫﻤﺎﻧﻨﺪ left outer joinsﻭﺟﻮﺩ ﺩﺍﺭﺩ ﻭﻟﻲ ﺍﻳﻦ ﻧﻮﻉ ﺍﺗﺼﺎﻻﺕ ﺑﻪ
ﺻﻮﺭﺕ ﺻﺮﻳﺢ ﺩﺭ LINQﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﻧﺸﺪﻩ ﻭﻟﻲ ﺩﺭ ﺯﻳﺮ ﻣﺠﻤﻮﻋﻪ ﻗﺎﺑﻠﻴﺖ ﻫﺎﻱ ﻋﻤﻠﮕﺮ GroupJoinﻗﺮﺍﺭ ﺩﺍﺭﻧﺪ.
ﻣﺜﺎﻝ :ﺩﺭ ﺑﺮﻧﺎﻣﻪ ﺯﻳﺮ ﺍﺷﻴﺎﺀ Customerﻭ Orderﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻣﻘﺪﺍﺭ CustomerIDﺑﻪ ﻫﻢ ﺩﻳﮕﺮ ﻣﺘﺼﻞ ﻣﻲ ﺷﻮﻧﺪ ﻭ ﺩﺭ
ﺧﺮﻭﺟﻲ ﺷﺊ ﺩﺍﺭﻳﻢ ﮐﻪ ﺷﺎﻣﻞ ﺍﻃﻼﻋﺎﺗﻲ ﺗﺮﮐﻴﺐ ﺷﺪﻩ ﺍﺯ ﺍﻳﻦ ﺩﻭ ﺷﺊ ﺍﺳﺖ.
var query =
from c in customers
join o in orders on c.CustomerID equals o.CustomerID
select new {FullName = c.Name + " " +
c.Family ,
c.CustomerID ,
o.OrderDate ,
TotalOrder = o.Total
};
: ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖC# 3.0 ﻣﻌﺎﺩﻝ ﻋﺒﺎﺭﺕ ﭘﺮﺱ ﻭ ﺟﻮﻱ ﺑﺎﻻ ﺑﻮﺳﻴﻠﻪ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﺩﺭ
GroupJoin ﻋﻤﻠﮕﺮ
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺍﺭﺍﻱ ﺩﻭ. left outer joins ﻫﻤﺎﻧﻨﺪ، ﻫﺎ ﻣﻮﺭﺩ ﺍﺳﺘﻔﺎﻩ ﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﺩJoin ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺮﺍﻱ ﺍﻧﻮﺍﻉ ﺧﺎﺻﻲ ﺍﺯ
:ﺳﺮﺑﺎﺭ ﮔﺬﺍﺭﻱ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ
ﺭﺍ ﺩﺭ ﻗﺎﻟﺐ ﻳﮏ ﻣﺠﻤﻮﻋﻪjoin ﻋﻤﻞ ﻣﻲ ﮐﻨﺪ ﻭﻟﻲ ﺑﺎ ﺍﻳﻦ ﺗﻔﺎﻭﺕ ﮐﻪ ﻧﺘﻴﺠﻪ ﻋﻤﻠﻴﺎﺕJoin ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻠﮕﺮ
.ﺟﺪﻳﺪ ﻗﺮﺍﺭ ﻣﻲ ﺩﻫﺪ
. ﻣﺜﺎﻝ
Group By ﻋﻤﻠﮕﺮ
.ﺑﻮﺳﻴﻠﻪ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﻲ ﺗﻮﺍﻥ ﻋﻨﺎﺻﺮﻱ ﺍﺯ ﻣﺠﻤﻮﻋﻪ ﻧﺘﻴﺠﻪ ﺭﺍ ﺑﻮﺳﻴﻠﻪ ﻳﮏ ﺷﺮﻁ ﺧﺎﺹ )ﺗﺎﺑﻊ ﮔﺰﻳﻨﺸﻲ( ﺩﺳﺘﻪ ﺑﻨﺪﻱ ﮐﺮﺩ
. ﺍﺳﺖSQL ﺩﺭGroup By ﺩﻗﻴﻘﺎ ﻣﺸﺎﺑﻪ ﻣﺎﺩﻩLINQ ﺩﺭGroup by ﻋﻤﻠﮑﺮﺩ ﻋﻤﻠﮕﺮ ﺩﺳﺘﻪ ﺑﻨﺪﻱ
ﺳﺮﺑﺎﺭﮔﺬﺍﺭﻱ ﺍﻭﻝ ﺍﻳﻦ4 ﺩﺭ ﺯﻳﺮ، ﻧﻮﻉ ﺳﺮﺑﺎﺭﮔﺬﺍﺭﻱ ﺍﺳﺖ8 ﺗﻨﻬﺎ ﻋﻤﻠﮕﺮ ﺩﺭ ﺍﻳﻦ ﮔﺮﻭﻩ ﻣﻲ ﺑﺎﺷﺪ ﮐﻪ ﺷﺎﻣﻞGroup By ﻋﻤﻠﮕﺮ
.ﻋﻤﻠﮕﺮ ﺁﻣﺪﻩ ﺍﺳﺖ
ﺑﺮﺍﻱ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝIEnumerable<IGrouping<TKey, TElement >> ﻳﮏ ﻧﻮﻉ ﺍﺯ،ﺩﺭ ﺑﺎﺭﮔﺬﺍﺭﻱ ﻫﺎﻱ ﺍﻳﻦ ﻋﻤﻠﮕﺮ
ﻧﺤﻮﻩ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺍﻳﻦ ﺭﺍﺑﻂ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ. ﻓﺮﺍﻫﻢ ﮐﺮﺩﻩ ﺍﺳﺖKey ﻣﻲ ﮔﺮﺩﺩ ﮐﻪ ﺩﺭ ﺧﻮﺩ ﻳﮏ ﺧﺼﻮﺻﻴﺖ ﻓﻘﻂ ﺧﻮﺍﻧﺪﻧﻲ
.ﺍﺳﺖ
ﺑﻮﺳﻴﻠﻪ ﺍﺭﺯﻳﺎﺑﻲ ﻭ ﺷﻤﺎﺭﺵ ﭘﺎﺭﺍﻣﺘﺮsource ﭘﺎﺭﺍﻣﺘﺮ ﺍﻭﻝ ﺗﺎﺑﻊ ﻳﻌﻨﻲGroup by ﺩﺭ ﺯﻣﺎﻥ ﺍﺟﺮﺍﻱ ﭘﺮﺱ ﻭ ﺟﻮ ﺣﺎﻭﻱ ﻋﻤﻠﮕﺮ
>> ﺗﻌﻴﻴﻦ ﻣﻲ ﮔﺮﺩﺩ ﻭ ﺧﺮﻭﺟﻲ ﺩﺭ ﻳﮏ ﻧﻤﻮﻧﻪ ﺍﺯelementSelector ﻭkeySelector ﻫﺎﻱ
ﺁﻥ ﺑﺮﺍﻱ ﻧﻤﺎﻳﺶ ﺩﺍﺩﻥKey ﺩﺭﺝ ﻣﻲ ﺷﻮﺩ ﮐﻪ ﺧﺼﻮﺻﻴﺖ ﻓﻘﻂ ﺧﻮﺍﻧﺪﻧﻲIEnumerable<IGrouping<TKey, TElement
. ﻣﻮﺭﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﺩ، ﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﺩgroup by ﺩﺭ ﻋﻤﻠﮕﺮby ﻓﻴﻠﺪﻱ ﺟﻠﻮﻱ ﻗﺴﻤﺖ
34|ﺻﻔﺤﻪ LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
.2 ﻣﺜﺎﻝ
cc ﺩﺭ ﺍﻳﻦ ﻣﺜﺎﻝ ﻣﺸﺘﺮﻳﺎﻥ ﺑﺮ ﺍﺳﺎﺱ ﮐﺸﻮﺭﺷﺎﻥ ﺩﺳﺘﻪ ﺑﻨﺪﻱ ﻣﻲ ﺷﻮﻧﺪ ﻭ ﻭ ﺩﺭ ﻧﺘﻴﺠﻪ ﺍﻳﻦ ﺩﺳﺘﻪ ﺑﻨﺪﻱ ﺩﺭ ﺩﺭﻭﻥ ﻣﺘﻐﻴﺮ
ﺑﻪ ﻋﻨﻮﺍﻥ ﺧﺮﻭﺟﻲ ﭘﺮﺱ ﻭ ﺟﻮ ﺍﻧﺘﺨﺎﺏ ﻣﻲcc ﻣﺮﺑﻮﻁ ﺑﻪkey ﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﺩ ﻭ ﺳﭙﺲ ﮔﺮﻭﻩ ﮐﺸﻮﺭﻫﺎ ﺑﺮ ﺍﺳﺎﺱ ﺧﺼﻮﺻﻴﺖ
.ﺷﻮﻧﺪ
www.AliAghdam.ir | ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ35 ﺻﻔﺤﻪ
OrderBy ﻋﻤﻠﮕﺮ
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺎﺻﺮ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺮ ﺍﺳﺎﺱ ﻳﮏ ﮐﻠﻴﺪ ﺑﻪ ﺻﻮﺭﺕ ﺻﻌﻮﺩﻱ ﻣﺮﺗﺐ ﻣﻲ ﮐﻨﺪ ﮐﻪ ﻋﻤﻠﮑﺮﺩﻱ ﻣﺎﻧﻨﺪ ﻣﺎﺩﻩ
. ﺩﺍﺭﺩOrder By
ﺑﺮﺍﻱ ﺗﻌﻴﻴﻦ ﻓﻴﻠﺪﻱ ﮐﻪ ﻋﻤﻠﻴﺎﺕ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﺑﺮ ﺍﺳﺎﺱ ﺁﻥ ﺑﺮ ﺭﻭﻱkeySelector ﺩﺭ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﭘﺮﺍﻣﺘﺮ
ﻣﻲ ﺗﻮﺍﻥ ﺑﺮﺍﻱcompare ﺩﺭ ﻓﺮﻡ )ﺑﺎﺭﮔﺰﺍﺭﻱ( ﺩﻭﻡ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﺯ ﭘﺎﺭﺍﻣﺘﺮ. ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ، ﺻﻮﺭﺕ ﻣﻲ ﮔﻴﺮﺩsource
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ ﺯﻣﺎﻥ ﺍﺟﺮﺍﻱ ﺑﺮﻧﺎﻣﻪ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺮ ﺍﺳﺎﺱ ﭘﺮﺍﻣﺘﺮ.ﻋﻤﻠﻴﺎﺕ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﺳﻔﺎﺭﺷﻲ ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ
. ﺭﺍ ﺑﺮﻣﻲ ﮔﺮﺩﺍﻧﺪIOrderedEnumerable<TSource> ﺍﺭﺯﻳﺎﺑﻲ ﻣﻲ ﻧﻤﺎﻳﺪ ﻭ ﻳﮏ ﻧﻤﻮﻧﻪ ﺍﺯ ﻧﻮﻉkeySelector
ﺑﺮﺍﻱ ﺗﻌﻴﻴﻦ ﻓﻴﻠﺪﻱ ﮐﻪ ﻋﻤﻠﻴﺎﺕ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﺑﺮ ﺍﺳﺎﺱ ﺁﻥ ﺑﺮ ﺭﻭﻱkeySelector ﺩﺭ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﭘﺮﺍﻣﺘﺮ
ﻣﻲ ﺗﻮﺍﻥ ﺑﺮﺍﻱcompare ﺩﺭ ﻓﺮﻡ )ﺑﺎﺭﮔﺰﺍﺭﻱ( ﺩﻭﻡ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﺯ ﭘﺎﺭﺍﻣﺘﺮ. ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ، ﺻﻮﺭﺕ ﻣﻲ ﮔﻴﺮﺩsource
ﺩﺭ ﺯﻣﺎﻥ ﺍﺟﺮﺍﻱ ﺑﺮﻧﺎﻣﻪ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪOrderBy ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻠﮕﺮ.ﻋﻤﻠﻴﺎﺕ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﺳﻔﺎﺭﺷﻲ ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ
ﺭﺍ ﺑﺮﻣﻲIOrderedEnumerable<TSource> ﺍﺭﺯﻳﺎﺑﻲ ﻣﻲ ﻧﻤﺎﻳﺪ ﻭ ﻳﮏ ﻧﻤﻮﻧﻪ ﺍﺯ ﻧﻮﻉkeySelector ﺭﺍ ﺑﺮ ﺍﺳﺎﺱ ﭘﺮﺍﻣﺘﺮ
.ﮔﺮﺩﺍﻧﺪ
ﻋﻤﻠﮕﺮ Thenby
ﻋﻤﻠﮑﺮ OrderByﺍﻳﻦ ﻋﻤﻠﻴﺎﺕ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﺭﺍ ﺑﺮ ﺍﺳﺎﺱ ﻳﮏ ﮐﻠﻴﺪ ﺭﺍ ﺍﻣﺎﮐﻦ ﭘﺬﻳﺮ ﻣﻲ ﻧﻤﻮﺩ ﻭﻟﻲ ﺑﺮﺍﻱ ﺍﻳﻨﮑﻪ ﺑﺘﻮﺍﻥ ﺍﺯ
ﻋﻤﻠﻴﺎﺕ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﺑﻪ ﺻﻮﺭﺕ ﺻﻌﻮﺩﻱ ﺭﺍ ﺑﺮ ﺍﺳﺎﺱ ﭼﻨﺪ ﮐﻠﻴﺪ ﺍﻧﺠﺎﻡ ﺩﺍﺩ ،ﻣﻲ ﺑﺎﻳﺴﺖ ﺍﺯ ﻋﻤﻠﮕﺮ ThenByﺍﺳﺘﻔﺎﺩﻩ ﻧﻤﻮﺩ.
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻠﮕﺮ OrderByﻣﻌﻤﻮﻝ ﺍﺳﺖ ﺗﻨﻬﺎ ﺑﺎ ﺍﻳﻦ ﺗﻔﺎﻭﺕ ﮐﻪ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﻲ ﺗﻮﺍﻧﺪ ﺗﻨﻬﺎ ﺑﺮ ﺭﻭﻱ ﻧﻮﻉ
> IOrderedEnumerable<TSourceﻋﻤﻠﻴﺎﺕ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﺭﺍ ﺍﻧﺠﺎﻡ ﺩﺍﺩ ﮐﻪ ﺑﺪﻳﻦ ﻭﺳﻴﻠﻪ ﻣﻲ ﺑﺎﻳﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺭﺍ ﺑﻌﺪ ﺍﺯ
ﻋﻤﻠﮕﺮ OrderByﻭ ﻳﺎ Orderby Descendingﻭ ﻳﺎ Thenby Descendingﺍﺳﺘﻔﺎﺩﻩ ﻧﻤﻮﺩ.
ﺍﻟﺒﺘﻪ ﺩﺭ ﺯﻣﺎﻥ ﻧﻮﺷﺘﻦ ﭘﺮﺱ ﻭ ﺟﻮﻫﺎ ﺑﻪ ﺻﻮﺭﺕ ﻋﺒﺎﺭﺕ ﻫﺎﻱ ﭘﺮﺱ ﻭ ﺟﻮﻱ LINQﺍﺯ ﻋﻤﻠﮕﺮ OrderByﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ
ﻭ ﮐﻠﻴﺪﻫﺎ ﺑﻮﺳﻴﻪ ﮐﺎﻣﺎ ) ¡ ( ﺍﺯ ﻳﮑﺪﻳﮕﺮ ﺟﺪﺍ ﮐﺎﻣﭙﺎﻳﻞ ﺷﺪﻥ ﭘﺮﺱ ﻭ ﺟﻮ ﻫﺎ ﮐﺎﻣﭙﺎﻳﻠﺮ ﺧﻮﺩ ﺍﻳﻦ ﻣﻮﺭﺩ ﺭﺍ ﻣﺘﻮﺟﻪ ﺷﺪﻩ ﻭ ﻋﺒﺎﺭﺕ
ﻣﺘﺪﻱ ﺁﻥ ﺭﺍ ﺗﻨﻈﻴﻢ ﻣﻲ ﮐﻨﺪ.
ﻫﻤﺎﻧﻄﻮﺭ ﮐﻪ ﺩﺭ ﻋﺒﺎﺭﺕ ﺑﺎﻻ ﻣﺸﺎﻫﺪﻩ ﻣﻲ ﮐﻨﻴﺪ ﻋﻤﻠﮕﺮ ThenByﺩﺭ ﺻﻮﺭﺕ ﻣﺘﺪﻱ ﺧﻮﺩ ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮﺩ ﻭ ﺩﺭ ﻧﻮﻉ "ﻋﺒﺎﺭﺕ
ﭘﺮﺱ ﻭ ﺟﻮ" ﺍﺯ ﻫﻤﺎﻥ ﻋﻤﻠﮕﺮ OrderByﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ ﻭ ﮐﻠﻴﺪﻫﺎ ﺑﺎ ﮐﺎﻣﺎ ﺍﺯ ﻳﮑﺪﻳﮕﺮ ﺟﺪﺍ ﻣﻲ ﺷﻮﻧﺪ .ﺑﺮﺍﻱ ﮐﺎﻣﭙﺎﺳﻞ ﺷﺪﻥ
38|ﺻﻔﺤﻪ LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
ﺩﺭ ﺍﺑﺘﺪﺍﻱ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﻭﺟﻮﺩOrderBy ﻋﺒﺎﺭﺍﺕ ﻣﻲ ﺗﻮﺍﻥ ﺗﺮﺗﻴﺐ ﺯﻳﺮ ﺭﺍ ﻧﻮﺷﺖ ﮐﻪ ﺩﺭ ﻫﺮ ﺻﻮﺭﺕ ﻣﻲ ﺑﺎﻳﺴﺖ ﻳﮏ ﻋﻤﻠﮕﺮ
. ﺗﻬﻴﻪ ﺷﻮﺩ ﺗﺎ ﻋﻤﻠﮕﺮ ﻫﺎﻱ ﺩﻳﮕﺮ ﺑﺮ ﺭﻭﻱ ﺁﻥ ﻋﻤﻞ ﮐﻨﻨﺪIOrderedEnumerable<TSource> ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ ﺗﺎ ﻳﮏ ﻧﻮﻉ
ThenByDecending ﻋﻤﻠﮕﺮ
ﺩﺍﺭﺩ ﻭ ﺗﻨﻬﺎ ﺗﻔﺎﻭﺕ ﺁﻧﻬﺎ ﺩﺭ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ ﺍﻳﻦ ﺗﺎﺑﻊ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﻪThenby ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﮐﺎﺭﮐﺮﺩﻱ ﺩﻗﻴﻘﺎ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻠﮕﺮ
. ﺍﻳﻦ ﺗﺎﺑﻊ ﺩﺍﺭﺍﻱ ﺩﻭ ﺳﺮﺑﺎﺯﮔﺬﺍﺭﻱ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ.ﺻﻮﺭﺕ ﻧﺰﻭﻟﻲ ﻣﺮﺗﺐ ﻣﻲ ﮐﻨﺪ
ﻋﻤﻞ ﮐﻨﺪ ﮐﻪIOrderedEnumerable<TSource> ﺑﺮ ﺭﻭﻱ ﻣﺠﻤﻮﻋﻪ ﺍﻱ ﺍﺯ ﻧﻮﻉThenBy ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻠﮕﺮ
ﺍﺳﺘﻔﺎﺩﻩ ﺷﻮﺩ ﻭ ﺩﺭ ﻧﻮﺷﺘﺎﺭThenBy ﻭ ﻳﺎOrderByDescending ¡ OrderBy ﺑﻪ ﻫﻤﻴﻦ ﺩﻟﻴﻞ ﻣﻲ ﺑﺎﻳﺴﺖ ﺑﻌﺪ ﺍﺯ ﻋﻤﻠﮕﺮﻫﺎﻱ
ﺭﺍ ﻣﻘﺎﺑﻞ ﮐﻠﻴﺪ ﻧﻮﺷﺖ ﻭ ﺩﺭ ﻧﻮﻉ ﻣﺘﺪﻱ ﻣﻲ ﺑﺎﻳﺴﺖ ﺑﻪ ﺻﻮﺭﺕ ﻣﺴﺘﻘﻴﻢDescending "ﻋﺒﺎﺭﺕ ﭘﺮﺱ ﻭ ﺟﻮ" ﻣﻲ ﺑﺎﻳﺴﺖ ﮐﻠﻤﻪ
. ﺍﺳﺘﻔﺎﺩﻩ ﻧﻤﻮﺩThenByDescending ﺍﺯ ﻣﺘﺪ
.ﻣﺜﺎﻝ
Reverse ﻋﻤﻠﮕﺮ
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻫﻤﺎﻧﻨﺪ ﻧﺎﻡ ﺧﻮﺩ ﺑﺮﺍﻱ ﻭﺍﺭﻭﻥ ﮐﺮﺩﻥ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺑﻪ ﮐﺎﺭ ﻣﻲ ﺭﻭﺩ ﻳﻌﻨﻲ ﻋﻨﺎﺻﺮ ﭼﻴﻨﺶ ﻋﻨﺎﺻﺮ ﻧﺘﻴﺠﻪ ﺭﺍ
.ﺑﺮﻋﮑﺲ ﻣﻲ ﮐﻨﺪ ﻭ ﻓﻘﻂ ﺩﺍﺭﺍﻱ ﻳﮏ ﺑﺎﺭﮔﺰﺍﺭﻱ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ
ﺍﻣﺎIEnumerable<T> ﮐﺎﺭﮐﺮﺩ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺴﻴﺎﺭ ﺳﺎﺩﻩ ﺍﺳﺖ ﻭ ﺩﺭ ﺯﻣﺎﻥ ﺍﺟﺮﺍ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺩﺭ ﻳﮏ ﻧﻤﻮﻧﻪ ﺟﺪﻳﺪ ﺍﺯ
.ﺑﻪ ﺻﻮﺭﺕ ﻋﮑﺲ ﻗﺮﺍﺭ ﻣﻲ ﺩﻫﺪ
ﺩﺭ ﺍﻳﻦ ﻣﺜﺎﻝ ﻣﺮﺗﺐ ﺳﺎﺯﻱ ﺑﻪ ﺻﻮﺭﺕ ﺻﻌﻮﺩﻱ ﺑﺮ ﺍﺳﺎﺱ ﻧﺎﻡ ﻣﺸﺘﺮﻱ ﺻﻮﺭﺕ ﻣﻲ ﮔﻴﺮﺩ ﻭ ﺳﭙﺲ ﺑﻮﺳﻴﻠﻪ ﻋﻤﻠﮕﺮ.1ﻣﺜﺎﻝ
.( ﭼﻴﺪﻣﺎﻥ ﻋﻨﺎﺻﺮ ﺑﺮﻋﮑﺲ ﻣﻲ ﺷﻮﺩ )ﻳﻌﻨﻲ ﺑﻪ ﺻﻮﺭﺕ ﻧﺰﻭﻟﻲReverse
List<Customer> customers = new List<Customer>()
{
new Customer() {Name ="Ali",Family="Aghdam",Country="iran",CustomerID =0 },
new Customer() {Name ="Ali",Family="Nasiri",Country="england",CustomerID =1 },
new Customer() {Name ="Arash",Family="Novin",Country="india",CustomerID =2 },
new Customer() {Name ="Ali",Family="Novin",Country= "iran" , CustomerID =3 }
};
ﻋﻤﻠﮕﺮ Count
ﺍﺯ ﻋﻤﻠﮕﺮ Countﻣﻲ ﺗﻮﺍﻥ ﺑﺮﺍﻱ ﻣﺤﺎﺳﺒﻪ ﺗﻌﺪﺍﺩ ﻋﻨﺎﺻﺮ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺍﺳﺘﻔﺎﺩﻩ ﻧﻤﻮﺩ.
ﻓﺮﻡ ﺍﻭﻝ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺯﻣﺎﻧﻲ ﻣﻮﺭﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﺩ ﮐﻪ sourceﺭﺍﺑﻂ > IEnumerable<TSourceﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ
ﮐﺮﺩﻩ ﺑﺎﺷﺪ ،ﺩﺭ ﺍﻳﻦ ﺻﻮﺭﺕ ﺍﺯ ﻣﺘﺪ )( Countﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺷﺪﻩ ﺩﺭ ﺩﺭﻭﻥ ﺍﻳﻦ ﻭﺍﺳﻂ ﺑﺮﺍﻱ ﻣﺤﺎﺳﺒﻪ ﺗﻌﺪﺍﺩ ﻋﻨﺎﺻﺮ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ
predicate ﺷﻮﺩ ﻭﻟﻲ ﺯﻣﺎﻧﻲ ﮐﻪ sourceﺭﺍﺑﻂ > IEnumerable<TSourceﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﻧﮑﺮﺩﻩ ﺑﺎﺷﺪ ﺑﻮﺳﻴﻠﻪ ﺗﺎﺑﻊ ﭘﺎﺭﺍﻣﺘﺮ
ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺷﻤﺎﺭﺵ ﻣﻲ ﮐﻨﺪ ﻭ ﺳﭙﺲ ﺑﺎ ﺍﻓﺰﻭﺩﻥ 1ﺑﻪ ﺑﻪ ﺁﻥ ﺗﻌﺪﺍﺩ ﻋﻨﺎﺻﺮ ﺭﺍ ﺑﺮﻣﻲ ﮔﺮﺩﺍﻧﺪ.
ﻣﺜﺎﻝ.
ﺑﺮﺍﻱ ﺑﻪ ﺩﺳﺖ ﺁﻭﺭﺩﻥ ﻣﺤﺪﻭﺩﻩ Intﻣﻲ ﺗﻮﺍﻧﻴﺪ ﺍﺯ ﻣﺘﺪ ﻫﺎﻱ int.MaxValueﻭ int.MinValueﺍﺳﺘﻔﺎﺩﻩ ﮐﻨﻴﺪ.
www.AliAghdam.ir ﺻﻔﺤﻪ | 41ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ
ﻋﻤﻠﮕﺮ LongCount
ﺍﺯ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻠﮕﺮ Countﺑﺮﺍﻱ ﻣﺤﺎﺳﺒﻪ ﺗﻌﺪﺍﺩ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ ﻭ ﺗﻨﻬﺎ ﺗﻔﺎﻭﺕ ﺁﻧﻬﺎ ﺍﻳﻦ
ﺧﺮﻭﺟﻲ ﺭﺍ ﺍﺯ ﻧﻮﻉ Longﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ ﮐﻪ ﺑﻮﺳﻴﻠﻪ ﺁﻥ ﻣﻲ ﺗﻮﺍﻥ ﺗﻌﺪﺍﺩ ﻋﻨﺎﺻﺮ ﺑﻴﺸﺘﺮ ﺭﺍ ﻣﻮﺭﺩ ﺍﺳﺖ ﮐﻪ ﻋﻤﻠﮕﺮLongCount
ﻓﺮﻡ ﺍﻭﻝ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺯﻣﺎﻧﻲ ﻣﻮﺭﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﺩ ﮐﻪ sourceﺭﺍﺑﻂ > IEnumerable<TSourceﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ
ﮐﺮﺩﻩ ﺑﺎﺷﺪ ،ﺩﺭ ﺍﻳﻦ ﺻﻮﺭﺕ ﺍﺯ ﻣﺘﺪ )( Countﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺷﺪﻩ ﺩﺭ ﺩﺭﻭﻥ ﺍﻳﻦ ﻭﺍﺳﻂ ﺑﺮﺍﻱ ﻣﺤﺎﺳﺒﻪ ﺗﻌﺪﺍﺩ ﻋﻨﺎﺻﺮ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ
predicate ﺷﻮﺩ ﻭﻟﻲ ﺯﻣﺎﻧﻲ ﮐﻪ sourceﺭﺍﺑﻂ > IEnumerable<TSourceﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﻧﮑﺮﺩﻩ ﺑﺎﺷﺪ ﺑﻮﺳﻴﻠﻪ ﺗﺎﺑﻊ ﭘﺎﺭﺍﻣﺘﺮ
ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺷﻤﺎﺭﺵ ﻣﻲ ﮐﻨﺪ ﻭ ﺳﭙﺲ ﺑﺎ ﺍﻓﺰﻭﺩﻥ 1ﺑﻪ ﺗﻌﺪﺍﺩ ﺁﻥ ﻋﻨﺎﺻﺮ ﺭﺍ ﺑﺮﻣﻲ ﮔﺮﺩﺍﻧﺪ.
ﻣﺜﺎﻝ.
ﻋﻤﻠﮕﺮ Sum
ﺍﺯ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺮﺍﻱ ﻣﺠﻤﻮﻉ ﻋﻨﺎﺻﺮ ﻋﺪﺩﻱ ﺩﺭ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ ﻭ ﺩﺍﺭﺍﻱ ﺩﻭ ﺳﺮﺑﺎﺭﮔﺰﺍﺭﻱ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ
ﺍﺳﺖ.
ﺩﺭ ﺩﻭ ﻓﺮﻡ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﻧﻮﻉ ﺑﺮﮔﺸﺘﻲ Numericﺩﻗﺖ ﮐﻨﻴﺪ .ﺍﻳﻦ ﻧﻮﻉ ﻣﻲ ﺗﻮﺍﻧﺪ ﻳﮑﻴﺎﺯ ﺍﻧﻮﺍﻉ ﺯﻳﺮ ﺑﺎﺷﺪ.
ﺩﺭ ﻓﺮﻡ ﻧﺨﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﺠﻤﻮﻉ ﺗﻤﺎﻣﻲ ﻋﻨﺎﺻﺮ ﻣﻮﺟﻮﺩ ﺩﺭ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺑﺮﮔﺸﺖ ﺩﺍﺩﻩ ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﺩﺭ ﻓﺮﻡ ﺩﻭﻡ ﺍﻳﻦ
. ﺗﻌﻴﻴﻦ ﺷﺪﻩ ﺑﺎﺷﺪselector ﻣﺠﻤﻮﻉ ﻋﻨﺎﺻﺮﻱ ﺍﺯ ﻣﺠﻤﻮﻋﻪ ﻣﺤﺎﺳﺒﻪ ﻣﻲ ﺷﻮﺩ ﮐﻪ ﺗﻮﺳﻂ ﺗﺎﺑﻊ
.ﻣﺜﺎﻝ
int[] integers = { 5, 3, 8, 9, 1, 7 };
int sum = integers.Sum();
Console.WriteLine("Total of all Numbers : {0}", sum.ToString());
ﺗﺎﺑﻊ، ﺭﺍ ﺑﺮﺭﺳﻲ ﻣﻲ ﮐﻨﻨﺪ ﻭ ﺳﭙﺲ ﺑﺮﺍﻱ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﺑﺰﺭﮔﺘﺮﻳﻦ ﻭ ﻳﺎ ﮐﻮﭼﮑﺘﺮﻳﻦ ﻣﻘﺪﺍﺭsource ﺍﻳﻦ ﺩﻭ ﻋﻤﻠﮕﺮ ﻣﺠﻤﻮﻋﻪ
ﮐﻮﭼﮑﺘﺮﻳﻦ ﻭ ﻳﺎ ﺑﺰﺭﮔﺘﺮﻳﻦ ﻋﻨﺼﺮ ﺑﺮ، ﺗﻌﻴﻴﻦ ﻧﺸﺪﻩ ﺑﺎﺷﺪselector ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﭘﺎﺭﺍﻣﺘﺮ، ﺭﺍ ﻓﺮﺍﺧﻮﺍﻧﻲ ﻣﻲ ﮐﻨﻨﺪselector
.ﺍﺳﺎﺱ ﻣﻘﺪﺍﺭﺷﺎﻥ ﺍﻧﺘﺨﺎﺏ ﻭ ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ ﺷﻮﻧﺪ
. ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﻓﺮﻡ ﺍﻭﻝ ﺍﻳﻦ ﻋﻤﻠﮕﺮﻫﺎ ﺑﺮﺍﻱ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﮐﻮﭼﮑﺘﺮﻳﻦ ﻭ ﺑﺰﺭﮔﺘﺮﻳﻦ ﺍﻋﺪﺍﺩ ﺩﺭ ﺑﻴﻦ ﻣﺠﻤﻮﻋﻪ ﺍﻋﺪﺍﺩ ﻣﺜﺎﻝ ﻗﺒﻠﻲ.1ﻣﺜﺎﻝ
int[] integers = { 5, 3, 8, 9, 1, 7 };
int max = integers.Max();
int min = integers.Min();
Console.WriteLine("Min ={0} and Max = {1}", max , min);
www.AliAghdam.ir | ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ43 ﺻﻔﺤﻪ
.1 ﻣﺸﺘﺮﻱ ﺑﺎ ﮐﺪ، ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﻓﺮﻡ ﺩﻭﻡ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺮﺍﻱ ﭘﻴﺪﺍ ﮐﺮﺩﻥ ﺑﻴﺸﺘﺮﻳﻦ ﺳﻔﺎﺭﺵ.2ﻣﺜﺎﻝ
// Max Order
Console.WriteLine( query.Max(c => c.Total) );
//Min Order
Console.WriteLine( query.Min(c => c.Total) );
44|ﺻﻔﺤﻪ LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
Average ﻋﻤﻠﮕﺮ
.ﺑﺎ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﻲ ﺗﻮﺍﻥ ﻣﻴﺎﻧﮕﻴﻦ ﻋﻨﺎﺻﺮ ﻣﻮﺟﻮﺩ ﺩﺭ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﻣﺤﺎﺳﺒﻪ ﻧﻤﻮﺩ
ﻣﺤﺎﺳﺒﻪ ﻣﻲ ﺷﻮﺩ ﻭ ﺩﺭ ﻓﺮﻡ ﺩﻭﻡ ﻣﻴﺎﻧﮕﻴﻦsource ﺩﺭ ﻓﺮﻡ ﻧﺨﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﻴﺎﻧﮕﻴﻦ ﻋﻨﺎﺻﺮ ﻣﻮﺟﻮﺩ ﺩﺭ ﻣﺠﻤﻮﻋﻪ
ﻧﻮﻉ ﺧﺮﻭﺟﻲ ﺩﺭ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺎ ﻋﻤﻠﮕﺮ ﻫﺎﻱ ﻗﺒﻠﻲ ﺗﻔﺎﻭﺕ ﺩﺍﺭﺩ ﻭ ﺑﻪ. ﻣﺤﺎﺳﺒﻪ ﻣﻲ ﺷﻮﻧﺪselector ﻋﻨﺎﺻﺮ ﺑﺮ ﺍﺳﺎﺱ ﺗﺎﺑﻊ
Double ﺧﺮﻭﺟﻲ ﺍﺯ ﻧﻮﻉInt64 ﻭInt32 ﺑﻮﺩﻥ ﻧﻮﻉ ﻫﺎﻱ ﻋﺪﺩﻱ ﺑﺴﺘﮕﻲ ﺩﺍﺭﺩ ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﻧﻮﻉ ﻫﺎﻱ ﻋﺪﺩﻱnullability
Nullable<Double> ﺑﺎﺷﺪ ﺧﺮﻭﺟﻲ ﺍﺯ ﻧﻮﻉNullable<Int64> ﻭNullable<Int32> ﺧﻮﺍﻫﺪ ﺑﻮﺩ ﻭ ﺍﮔﺮ ﻧﻮﻉ ﻫﺎﻱ ﻋﺪﺩﻱ
.ﺧﻮﺍﻫﺪ ﺑﻮﺩ
int[] integers = { 5, 3, 8, 9, 1, 7 };
Aggregate ﻋﻤﻠﮕﺮ
.ﺍﻳﻦ ﺗﺎﺑﻊ ﺍﻳﻦ ﺍﻣﺎﮐﻦ ﺭﺍ ﻓﺮﺍﻫﻢ ﻣﻲ ﮐﻨﺪ ﮐﻪ ﻳﮏ ﺗﺎﺑﻊ ﺭﺍ ﺑﺮ ﺭﻭﻱ ﻫﺮﻳﮏ ﺍﺯ ﺍﻋﻀﺎﺀ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺍﺟﺮﺍ ﻧﻤﺎﻳﻴﻢ
ﺩﺭ ﻓﺮﻡ.)ﻳﻌﻨﻲ ﻧﻘﻄﻪ ﺷﺮﻭﻉ(ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮﺩ Aggregate ﺑﻪ ﻋﻨﻮﺍﻥ ﺍﻭﻟﻴﻦ ﻣﻘﺪﺍﺭ ﻋﻤﻠﮕﺮsource ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮ ﺩﺭ
ﺍﺯ ﻧﻮﻉseed ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮﺩ ﺩﺭ ﻓﺮﻡ ﺩﻭﻡ ﭘﺎﺭﺍﻣﺘﺮsource ﺍﻭﻝ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻧﻘﻄﻪ ﺷﺮﻭﻉ ﺍﺯ ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮ ﺩﺭ ﻣﺠﻤﻮﻋﻪ
ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮﺩ ﻭ ﺩﺭ ﻓﺮﻡ ﺳﻮﻡ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺗﺎﺑﻊAggregate ﺑﻪ ﻋﻨﻮﺍﻥ ﻧﻘﻄﻪ ﺷﺮﻭﻉ ﺑﺮﺍﻱ ﺗﺎﺑﻊTAccumulate
. ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮﺩaggregate ﺑﻪ ﻋﻨﻮﺍﻥ ﻧﻮﻋﻲ ﺷﺮﻁ ﺑﺮﺍﻱ ﭘﺎﻳﺎﻥ ﮐﺎﺭresultSelector
string sentence = "the quick brown fox jumps over the lazy dog";
// Split the string into individual words.
Console.WriteLine(reversed);
|ﺻﻔﺤﻪ46 LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
*/
This code produces the following output:
ﻋﻤﻠﮕﺮ Take
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺗﻌﺪﺍﺩﻱ ﺍﺯ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺮ ﺍﺳﺎﺱ ﻣﻘﺪﺍﺭ ﺍﺭﺳﺎﻟﻲ ﺑﻪ ﺁﻥ ،ﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ .ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺻﻮﺭﺕ
ﺯﻳﺮ ﺍﺳﺖ.
ﺩﺭﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﺯ ﻣﺠﻤﻮﻋﻪ sourceﺑﻪ ﺗﻌﺪﺍﺩ countﺗﺎ ﺍﺯ ﻋﻨﺎﺻﺮ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﺧﻮﺍﻫﻨﺪ ﺷﺪ.
ﻋﻤﻠﮕﺮ Skip
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺗﻌﺪﺍﺩﻱ ﻣﺸﺨﺺ ﺍﺯ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺻﺮﻑ ﻧﻈﺮ ﮐﺮﺩﻩ ﻭ ﺳﭙﺲ ﻋﻨﺎﺻﺮ ﺑﺎﻗﻴﻤﺎﻧﺪﻩ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﻪ
ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﮐﻨﺪ.
ﺩﺭﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ ﺍﺑﺘﺪﺍ ﻣﺠﻤﻮﻋﻪ sourceﺑﻪ ﺗﻌﺪﺍﺩ countﺗﺎ ﺷﻤﺎﺭﺵ ﺷﺪﻩ ﻭ ﺳﭙﺲ ﻋﻨﺎﺻﺮ ﺑﺎﻗﻴﻤﺎﻧﺪﻩ ﺩﺭ ﻣﺠﻤﻮﻋﻪ
sourceﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﺧﻮﺍﻫﻨﺪ ﺷﺪ.
ﻣﺜﺎﻝ .1ﺻﺮﻑ ﻧﻈﺮ ﮐﺮﺩﻥ ﺍﺯ 5ﻋﻨﺼﺮ ﺍﻭﻝ ﺩﺭ ﻟﻴﺴﺖ SampleListﻭ ﺍﻧﺘﺨﺎﺏ ﻋﻨﺎﺻﺮ ﺑﺎﻗﻴﻤﺎﻧﺪﻩ
ﻋﻤﻠﮕﺮ TakeWhile
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺎﺻﺮ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺗﺎ ﺯﻣﺎﻥ ﺑﺮﻗﺮﺍﺭ ﺑﻮﺩﻥ ﻳﮏ ﺷﺮﻁ ﻣﻌﻴﻦ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﮐﻨﺪ.
ﺩﺭ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﺠﻤﻮﻋﻪ sourceﺗﺎ ﺯﻣﺎﻧﻲ ﮐﻪ ﺷﺮﻁ ﻣﺮﺑﻮﻁ ﺑﻪ ﭘﺎﺭﺍﻣﺘﺮ predicateﻧﻘﺾ ﮔﺮﺩﺩ ،ﺷﻤﺎﺭﺵ ﺷﺪﻩ ﻭ ﺩﺭ ﻳﮏ
ﻧﻤﻮﻧﻪ ﺍﺯ ﻧﻮﻉ > IEnumerable<TSourceﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﺩ .ﺩﺭ ﻓﺮﻡ ﺩﻭﻡ ﺗﺎﺑﻊ predicateﻳﮏ ﭘﺎﺭﺍﻣﺘﺮ ﺍﺯ ﻧﻮﻉ intﺭﺍ ﺩﺍﺭﺍ ﻣﻲ
ﺑﺎﺷﺪ ﮐﻪ ﻣﺤﻞ ﻗﺮﺍﺭ ﮔﻴﺮﻱ ﻋﻨﺎﺻﺮ ﺑﺮ ﺭﻭﻱ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﻧﺸﺎﻥ ﻣﻲ ﺩﻫﺪ.
48|ﺻﻔﺤﻪ LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
SkipWhile ﻋﻤﻠﮕﺮ
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﺯ ﻋﻨﺎﺻﺮ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺗﺎ ﺯﻣﺎﻥ ﻧﻘﺾ ﻳﮏ ﺷﺮﻁ ﻣﻌﻴﻦ ﺻﺮﻑ ﻧﻈﺮ ﻣﻲ ﮐﻨﺪ ﻭ ﺑﺎﻗﻴﻤﺎﻧﺪﻩ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ
.ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﮐﻨﺪ
ﺻﺮﻑ ﻧﻈﺮ ﻣﻲ، ﻧﻘﺾ ﮔﺮﺩﺩpredicate ﺗﺎ ﺯﻣﺎﻧﻲ ﮐﻪ ﺷﺮﻁ ﻣﺮﺑﻮﻁ ﺑﻪ ﭘﺎﺭﺍﻣﺘﺮsource ﺩﺭ ﺍﻳﻦ ﻋﻤﻠﮕﺮﺍﺯ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ
ﺩﺭ. ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﮔﺮﺩﻧﺪIEnumerable<TSource> ﺷﻮﺩ ﻭ ﺑﺎﻗﻴﻤﺎﻧﺪﻩ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺩﺭ ﻗﺎﻟﺐ ﻳﮏ ﻧﻤﻮﻧﻪ ﺍﺯ ﻧﻮﻉ
ﺭﺍ ﺩﺍﺭﺍ ﻣﻲ ﺑﺎﺷﺪ ﮐﻪ ﻣﺤﻞ ﻗﺮﺍﺭ ﮔﻴﺮﻱ ﻋﻨﺎﺻﺮ ﺑﺮ ﺭﻭﻱ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﻧﺸﺎﻥint ﻳﮏ ﭘﺎﺭﺍﻣﺘﺮ ﺍﺯ ﻧﻮﻉpredicate ﻓﺮﻡ ﺩﻭﻡ ﺗﺎﺑﻊ
.ﻣﻲ ﺩﻫﺪ
www.AliAghdam.ir | ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ49 ﺻﻔﺤﻪ
Concat ﻋﻤﻠﮕﺮ
.ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﻭ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﻪ ﻫﻢ ﻣﺘﺼﻞ ﻣﻲ ﮐﻨﺪ
ﺍﺳﺖ ﻭ ﺗﻨﻬﺎ ﺷﺮﻁ ﺩﺭ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻳﮑﺴﺎﻥ ﺑﻮﺩﻥ ﺩﻭIEnumerable<TSource> ﺧﺮﻭﺟﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﺯ ﻧﻮﻉ
. ﺍﺯ ﻳﮏ ﻧﻮﻉ ﺍﺳﺖsecond ﻭfirst ﭘﺎﺭﺍﻣﺘﺮ
First ﻋﻤﻠﮕﺮ
. ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺩﻭ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ.ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ
ﺩﺭ ﻓﺮﻡ ﻧﺨﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮ ﻣﺠﻤﻮﻋﻪ ﺑﻪ ﻋﻨﻮﺍﻥ ﺧﺮﻭﺟﻲ ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﺩﺭ ﻓﺮﻡ ﺩﻭﻡ ،ﻋﻨﺎﺻﺮ
ﺍﺳﺖ ،ﺑﺮﺭﺳﻲ ﻣﻲ ﺷﻮﻧﺪ ﻭ ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮﻱ ﮐﻪ ﺻﺤﺖ ﺷﺮﻁ ﺭﺍ predicate ﻣﺠﻤﻮﻋﻪ ﺍﺯ ﺍﺑﺘﺪﺍ ﺑﻮﺳﻴﻠﻪ ﺷﺮﻁ ﮐﻪ ﻫﻤﺎﻥ ﺗﺎﺑﻊ
ﺑﺮﻗﺮﺍﺭ ﮐﻨﺪ ﺑﻪ ﻋﻨﻮﺍﻥ ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ.
;)Console.Write(query
;)Console.Write(query
ﻋﻤﻠﮕﺮ FirstOrDefault
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ ﻭ ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﻋﻨﺼﺮﻱ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﻭﺟﻮﺩ ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﺪ ﻭ ﻳﺎ ﺷﺮﻁ
ﺭﺍ ﺑﺮﻗﺮﺍﺭ ﻧﮑﻨﺪ ،ﻣﻘﺪﺍﺭ ﭘﻴﺶ ﻓﺮﺿﻲ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ .ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺩﻭ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ.
ﺩﺭ ﻓﺮﻡ ﻧﺨﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮ ﻣﺠﻤﻮﻋﻪ ﺑﻪ ﻋﻨﻮﺍﻥ ﺧﺮﻭﺟﻲ ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﺩﺭ ﻓﺮﻡ ﺩﻭﻡ ﻋﻨﺎﺻﺮ
ﺍﺳﺖ ،ﺑﺮﺭﺳﻲ ﻣﻲ ﺷﻮﻧﺪ ﻭ ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮﻱ ﮐﻪ ﺻﺤﺖ ﺷﺮﻁ ﺭﺍ predicate ﻣﺠﻤﻮﻋﻪ ﺍﺯ ﺍﺑﺘﺪﺍ ﺑﻮﺳﻴﻠﻪ ﺷﺮﻁ ﮐﻪ ﻫﻤﺎﻥ ﺗﺎﺑﻊ
ﺑﺮﻗﺮﺍﺭ ﮐﻨﺪ ﺑﻪ ﻋﻨﻮﺍﻥ ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ .ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﺩﺭ ﻫﺮ ﻳﮏ ﺍﺯ ﺩﻭ ﻓﺮﻡ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺼﺮﻱ
ﻣﻮﺟﻮﺩ ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﺪ ،ﻣﻘﺪﺍﺭ ﭘﻴﺶ ﻓﺮﺿﻲ ﺍﺯ ﺁﻥ ﻧﻮﻉ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ.
52|ﺻﻔﺤﻪ LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
Console.Write(query);
Console.Write(query);
Last ﻋﻤﻠﮕﺮ
. ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺩﻭ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ.ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺁﺧﺮﻳﻦ ﻋﻨﺼﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ
ﻋﻨﺎﺻﺮ،ﺩﺭ ﻓﺮﻡ ﻧﺨﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺁﺧﺮﻳﻦ ﻋﻨﺼﺮ ﻣﺠﻤﻮﻋﻪ ﺑﻪ ﻋﻨﻮﺍﻥ ﺧﺮﻭﺟﻲ ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﺩﺭ ﻓﺮﻡ ﺩﻭﻡ
( ﺑﺮﺭﺳﻲ ﻣﻲ ﺷﻮﻧﺪ ﻭ ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮﻱ )ﺍﺯ ﺍﻧﺘﻬﺎﻱ ﻣﺠﻤﻮﻋﻪ،ﺍﺳﺖ predicate ﻣﺠﻤﻮﻋﻪ ﺍﺯ ﺍﻧﺘﻬﺎ ﺑﻮﺳﻴﻠﻪ ﺷﺮﻁ ﮐﻪ ﻫﻤﺎﻥ ﺗﺎﺑﻊ
.ﮐﻪ ﺻﺤﺖ ﺷﺮﻁ ﺭﺍ ﺑﺮﻗﺮﺍﺭ ﮐﻨﺪ ﺑﻪ ﻋﻨﻮﺍﻥ ﺁﺧﺮﻳﻦ ﻋﻨﺼﺮ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ
Console.Write(query);
www.AliAghdam.ir ﺻﻔﺤﻪ | 53ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ
;)Console.Write(query
ﻋﻤﻠﮕﺮ LastOrDefault
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺁﺧﺮﻳﻦ ﻋﻨﺼﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ ﻭ ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﻋﻨﺼﺮﻱ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﻭﺟﻮﺩ ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﺪ ﻭ ﻳﺎ
ﺷﺮﻁ ﺭﺍ ﺑﺮﻗﺮﺍﺭ ﻧﮑﻨﺪ ،ﻣﻘﺪﺍﺭ ﭘﻴﺶ ﻓﺮﺿﻲ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ .ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺩﻭ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ.
ﺩﺭ ﻓﺮﻡ ﻧﺨﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺁﺧﺮﻳﻦ ﻋﻨﺼﺮ ﻣﺠﻤﻮﻋﻪ ﺑﻪ ﻋﻨﻮﺍﻥ ﺧﺮﻭﺟﻲ ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﺩﺭ ﻓﺮﻡ ﺩﻭﻡ ﻋﻨﺎﺻﺮ
ﺍﺳﺖ ،ﺑﺮﺭﺳﻲ ﻣﻲ ﺷﻮﻧﺪ ﻭ ﺍﻭﻟﻴﻦ ﻋﻨﺼﺮﻱ )ﺍﺯ ﺍﻧﺘﻬﺎ( ﮐﻪ ﺻﺤﺖ predicate ﻣﺠﻤﻮﻋﻪ ﺍﺯ ﺍﻧﺘﻬﺎ ﺑﻮﺳﻴﻠﻪ ﺷﺮﻁ ﮐﻪ ﻫﻤﺎﻥ ﺗﺎﺑﻊ
ﺷﺮﻁ ﺭﺍ ﺑﺮﻗﺮﺍﺭ ﮐﻨﺪ ﺑﻪ ﻋﻨﻮﺍﻥ ﺁﺧﺮﻳﻦ ﻋﻨﺼﺮ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ .ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﺩﺭ ﻫﺮ ﻳﮏ ﺍﺯ ﺩﻭ ﻓﺮﻡ ﺍﻳﻦ ﻋﻤﻠﮕﺮ
ﻋﻨﺼﺮﻱ ﻣﻮﺟﻮﺩ ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﺪ ،ﻣﻘﺪﺍﺭ ﭘﻴﺶ ﻓﺮﺿﻲ ﺍﺯ ﺁﻥ ﻧﻮﻉ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ.
;)Console.Write(query
|ﺻﻔﺤﻪ54 LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
;)Console.Write(query
ﻋﻤﻠﮕﺮ Single
ﺍﺯ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺮﺍﻱ ﺍﻧﺘﺨﺎﺏ ﻳﮏ ﻋﻨﺼﺮ ﺧﺎﺹ ﻭ ﻳﮑﺘﺎ ﺍﺯ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ.ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺩﻭ
ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ.
ﻓﺮﻡ ﺍﻭﻝ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺯﻣﺎﻧﻲ ﮐﻪ ﺗﻨﻬﺎ ﻳﮏ ﻋﻤﻠﮕﺮ ﺩﺭ ﻣﺠﻤﻮﻋﻪ sourceﻣﻮﺟﻮﺩ ﺑﺎﺷﺪ ،ﺁﻥ ﻋﻤﻠﮕﺮ ﺑﻪ ﻋﻨﻮﺍﻥ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ
sourceﺗﻬﻲ ﻭ ﻳﺎ ﺑﻴﺸﺘﺮ ﺍﺯ ﻳﮏ ﻋﻨﺼﺮ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ ،ﺍﺳﺘﺜﻨﺎ ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﻣﺠﻤﻮﻋﻪ
InvalidOperationExceptionﺭﺥ ﻣﻲ ﺩﻫﺪ.
ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﺍﺯ ﻓﺮﻡ ﺩﻭﻡ ﺍﺳﺘﻔﺎﺩﻩ ﺷﻮﺩ ﻳﻌﻨﻲ ﺍﻳﻨﮑﻪ ﻳﮏ ﺷﺮﻁ ﺑﺎ ﭘﺎﺭﺍﻣﺘﺮ predicateﺍﺭﺳﺎﻝ ﺷﻮﺩ ﻭ ﺩﺭ ﺑﻴﻦ ﻋﻨﺎﺻﺮ
ﻣﺠﻤﻮﻋﻪ ﺗﻨﻬﺎ ﻳﮏ ﻋﻨﺼﺮ ﺷﺮﻁ ﺭﺍ ﺑﺮﻗﺮﺍﺭ ﮐﻨﺪ ،ﺁﻥ ﻋﻨﺼﺮ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﺩﺭﺻﻮﺭﺗﻲ ﮐﻪ ﻫﻴﭻ ﻋﻨﺼﺮﻱ
ﺷﺮﻁ ﺭﺍ ﺑﺮﻗﺮﺍﺭ ﻧﮑﻨﺪ ﻭ ﻳﺎ ﭼﻨﺪﻳﻦ ﻋﻨﺼﺮ ﺷﺮﻁ predicateﺭﺍ ﺑﺮﻗﺮﺍﺭ ﮐﻨﻨﺪ ،ﺍﺳﺘﺜﻨﺎﺀ InvalidOperationExceptionﺭﺥ ﻣﻲ
ﺩﻫﺪ.
;)Console.Write(query
www.AliAghdam.ir ﺻﻔﺤﻪ | 55ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ
;)Console.Write(query
ﻋﻤﻠﮕﺮ SingleOrDefault
ﺍﺯ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺮﺍﻱ ﺍﻧﺘﺨﺎﺏ ﻳﮏ ﻋﻨﺼﺮ ﺧﺎﺹ ﻭ ﻳﮑﺘﺎ ﺍﺯ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ.ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺩﻭ
ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ.
ﻓﺮﻡ ﺍﻭﻝ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺯﻣﺎﻧﻲ ﮐﻪ ﺗﻨﻬﺎ ﻳﮏ ﻋﻤﻠﮕﺮ ﺩﺭ ﻣﺠﻤﻮﻋﻪ sourceﻣﻮﺟﻮﺩ ﺑﺎﺷﺪ ،ﺁﻥ ﻋﻤﻠﮕﺮ ﺑﻪ ﻋﻨﻮﺍﻥ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ
ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﻣﺠﻤﻮﻋﻪ sourceﺗﻬﻲ ﻭ ﻳﺎ ﺑﻴﺸﺘﺮ ﺍﺯ ﻳﮏ ﻋﻨﺼﺮ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ ،ﻳﮏ ﻧﻤﻮﻧﻪ ﭘﻴﺶ ﻓﺮﺽ ﺍﺯ ﻧﻮﻉ
sourceﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﮔﺮﺩﺩ.
ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﺍﺯ ﻓﺮﻡ ﺩﻭﻡ ﺍﺳﺘﻔﺎﺩﻩ ﺷﻮﺩ ﻳﻌﻨﻲ ﺍﻳﻨﮑﻪ ﻳﮏ ﺷﺮﻁ ﺑﺎ ﭘﺎﺭﺍﻣﺘﺮ predicateﺍﺭﺳﺎﻝ ﺷﻮﺩ ﻭ ﺩﺭ ﺑﻴﻦ ﻋﻨﺎﺻﺮ
ﻣﺠﻤﻮﻋﻪ ﺗﻨﻬﺎ ﻳﮏ ﻋﻨﺼﺮ ﺷﺮﻁ ﺭﺍ ﺑﺮﻗﺮﺍﺭ ﮐﻨﺪ ،ﺁﻥ ﻋﻨﺼﺮ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﺩﺭﺻﻮﺭﺗﻲ ﮐﻪ ﻫﻴﭻ ﻋﻨﺼﺮﻱ
ﺷﺮﻁ ﺭﺍ ﺑﺮﻗﺮﺍﺭ ﻧﮑﻨﺪ ﻭ ﻳﺎ ﭼﻨﺪﻳﻦ ﻋﻨﺼﺮ ﺷﺮﻁ predicateﺭﺍ ﺑﺮﻗﺮﺍﺭ ﮐﻨﻨﺪ ،ﻳﮏ ﻧﻤﻮﻧﻪ ﭘﻴﺶ ﻓﺮﺽ ﺍﺯ ﻧﻮﻉ sourceﺑﻪ ﺧﺮﻭﺟﻲ
ﺍﺭﺳﺎﻝ ﻣﻲ ﮔﺮﺩﺩ.
predicateﺭﺍ ﺑﺮﻗﺮﺍﺭ ﮐﻨﻨﺪ ،ﺍﺳﺘﺜﻨﺎﺀ ﺗﻮﺟﻪ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ﮐﻪ ﺩﺭ ﻫﺮ ﺩﻭ ﻓﺮﻡ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ،ﺍﮔﺮ ﭼﻨﺪﻳﻦ ﻋﻨﺼﺮ ﺷﺮﻁ
InvalidOperationExceptionﺭﺥ ﻣﻲ ﺩﻫﺪ.
|ﺻﻔﺤﻪ56 LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
;)Console.Write(query
;)Console.Write(query
ﻋﻤﻠﮕﺮ ElementAt
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺼﺮﻱ ﺭﺍ ﮐﻪ ﺍﻧﺪﻳﺲ ﺁﻥ ﺑﻪ ﻋﻨﻮﺍﻥ ﭘﺎﺭﺍﻣﺘﺮ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ ،ﺑﺮﻣﻲ ﮔﺮﺩﺍﻧﺪ) .ﺍﻧﺪﻳﺲ ﺍﺯ ﺻﻔﺮ ﺷﺮﻭﻉ ﻣﻲ ﺷﻮﺩ(
ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺩﻭ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ.
ﺩﺭ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻮﺳﻴﻠﻪ ﺷﻤﺎﺭﺵ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ، sourceﻋﻨﺼﺮﻱ ﮐﻪ ﺩﺍﺭﺍﻱ ﺍﻧﺪﻳﺲ indexﺍﺳﺖ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ
ﻣﻲ ﺷﻮﺩ ﻭ ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﺍﻧﺪﻳﺲ ﻭﺍﺭﺩ ﺷﺪﻩ ﻣﻌﺘﺒﺮ ﻧﺒﺎﺷﺪ ﻳﮏ ﺍﺳﺘﺜﻨﺎ ﺍﺯ ﻧﻮﻉ ArgumentNullExceptionﺭﺥ ﻣﻲ ﺩﻫﺪ .ﻧﮑﺘﻪ
ﻗﺎﺑﻞ ﺗﻮﺟﻪ ﺩﺭ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ ﺍﮔﺮ ﻣﺠﻤﻮﻋﻪ sourceﺭﺍﺑﻂ > IList<Tﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﺮﺩﻩ ﻳﺎﺷﺪ ﻋﻨﺎﺻﺮ ﺑﻪ ﺻﻮﺭﺕ
ﻣﺴﺘﻘﻴﻢ ﺷﻤﺎﺭﺵ ﻧﻤﻲ ﺷﻮﻧﺪ ﺑﻠﮑﻪ ﺑﻮﺳﻴﻠﻪ ﺗﻮﺍﺑﻊ ﺩﺍﺧﻠﻲ ﺍﻱ ﺭﺍﺑﻂ ﻋﻨﺼﺮ ﺩﺍﺭﺍﻱ ﺍﻧﺪﻳﺲ indexﺑﺮﮔﺪﺍﻧﺪﻩ ﻣﻲ ﺷﻮﺩ.
www.AliAghdam.ir ﺻﻔﺤﻪ | 57ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ
ﻣﺜﺎﻝ.
;)Console.Write(query
ﻋﻤﻠﮕﺮ ElementAtOrDefault
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺼﺮﻱ ﺭﺍ ﮐﻪ ﺍﻧﺪﻳﺲ ﺁﻥ ﺑﻪ ﻋﻨﻮﺍﻥ ﭘﺎﺭﺍﻣﺘﺮ ﺍﺭﺳﺎﻝ ﻣﻲ ﺷﻮﺩ ،ﺑﺮﻣﻲ ﮔﺮﺩﺍﻧﺪ) .ﺍﻧﺪﻳﺲ ﺍﺯ ﺻﻔﺮ ﺷﺮﻭﻉ ﻣﻲ ﺷﻮﺩ(
ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺩﻭ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ.
ﺩﺭ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻮﺳﻴﻠﻪ ﺷﻤﺎﺭﺵ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ، sourceﻋﻨﺼﺮﻱ ﮐﻪ ﺩﺍﺭﺍﻱ ﺍﻧﺪﻳﺲ indexﺍﺳﺖ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ
ﻣﻲ ﺷﻮﺩ ﻭ ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﺍﻧﺪﻳﺲ ﻣﻮﺭﺩ ﻧﻈﺮ ﻣﻌﺘﺒﺮ ﻧﺒﺎﺷﺪ ،ﻳﮏ ﻧﻤﻮﻧﻪ ﭘﻴﺶ ﻓﺮﺽ ﺍﺯ ﻧﻮﻉ sourceﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ
ﺷﻮﺩ .ﻧﮑﺘﻪ ﻗﺎﺑﻞ ﺗﻮﺟﻪ ﺩﺭ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ ﺍﮔﺮ ﻣﺠﻤﻮﻋﻪ sourceﺭﺍﺑﻂ > IList<Tﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﺮﺩﻩ ﻳﺎﺷﺪ ﻋﻨﺎﺻﺮ
ﺑﻪ ﺻﻮﺭﺕ ﻣﺴﺘﻘﻴﻢ ﺷﻤﺎﺭﺵ ﻧﻤﻲ ﺷﻮﻧﺪ ﺑﻠﮑﻪ ﺑﻮﺳﻴﻠﻪ ﺗﻮﺍﺑﻊ ﺩﺍﺧﻠﻲ ﺍﻱ ﺭﺍﺑﻂ ﻋﻨﺼﺮ ﺩﺍﺭﺍﻱ ﺍﻧﺪﻳﺲ indexﺑﺮﮔﺪﺍﻧﺪﻩ ﻣﻲ ﺷﻮﺩ.
ﻣﺜﺎﻝ.
;)Console.Write(query
58|ﺻﻔﺤﻪ LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
DefaultEmpty ﻋﻤﻠﮕﺮ
ﻓﺮﮎ ﮐﻠﻲ ﺍﻳﻦ.ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺮﺍﻱ ﺟﺎﻳﮕﺰﻳﻦ ﮐﺮﺩﻥ ﻳﮏ ﻋﻨﺼﺮ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺑﺎ ﻋﻨﺼﺮ ﭘﻴﺶ ﻓﺮﺽ ﺗﻌﻮﻳﺾ ﻣﻲ ﮐﻨﺪ
:ﻋﻤﻠﮕﺮ ﺑﻪ ﺩﻭ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ
ﺗﻬﻲ ﺑﺎﺷﺪ ﻳﮏsource ﺭﺍ ﺑﺮﻣﻲ ﺭﮔﺮﺩﺍﻧﺪ ﻭﻟﻲ ﻣﺠﻤﻮﻋﻪ source ﺁﺭﺍﻳﻪ ﺍﺯ ﻧﻮﻉ ﺑﻪ ﺻﻮﺭﺕ ﭘﻴﺶ ﻓﺮﺽ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻳﮏ
ﺗﻮﺟﻪ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ﮐﻪ ﺍﮔﺮ ﺍﺯ ﻓﺮﻡ ﻧﺨﺴﺖ ﺍﺳﺘﻔﺎﺩﻩ ﺷﻮﺩ ﻳﻌﻨﻲ ﻧﻮﻋﻲ. ﺭﺍ ﺑﺮﻣﻲ ﮔﺮﺩﺍﻧﺪsource ﻧﻤﻮﻧﻪ ﭘﻴﺶ ﻓﺮﺽ ﺍﺯ ﻧﻮﻉ
. ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩnull ﺍﺯ،ﺑﺮﺍﻱ ﭘﻴﺶ ﻓﺮﺽ ﻣﻌﻴﻦ ﻧﺸﺪﻩ ﺑﺎﺷﺪ
ﻋﻤﻠﮕﺮ Repeat
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ ﮐﻪ ﺣﺎﺻﻞ ﺗﮑﺮﺍﺭ ﻳﮏ ﻋﻨﺼﺮ ﺑﻪ ﺗﻌﺪﺍﺩ ﻣﻌﻴﻨﻲ ﺍﺳﺖ ،ﺍﻳﺠﺎﺩ ﻣﻲ ﮐﻨﺪ ﻭ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ
ﻣﻲ ﮐﻨﺪ .ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ:
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ ﺯﻣﺎﻥ ﺍﺟﺮﺍ ﺍﺯ ﻧﻮﻉ ﻋﻤﻠﮕﺮ elementﺑﻪ ﺗﻌﺪﺍﺩ countﺗﮑﺮﺍﺭ ﻧﻤﻮﺩﻩ ﻭ ﻣﺠﻤﻮﻋﻪ ﺣﺎﺻﻞ ﮐﻪ ﺍﺯ ﻧﻮﻉ
> IEnumerable<TResultﺍﺳﺖ ،ﺑﺮﻣﻲ ﮔﺮﺩﺍﻧﺪ.
ﻣﺜﺎﻝ.
2
Reference type
60|ﺻﻔﺤﻪ LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
newC.Family = "Aghdam";
//Out:
//Family : Shah Mohammadi
//Family : Shah Mohammadi
//Family : Shah Mohammadi
//Family : Shah Mohammadi
//Family : Aghdam
//Family : Aghdam
//Family : Aghdam
//Family : Aghdam
Range ﻋﻤﻠﮕﺮ
ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ.ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﺠﻤﻮﻋﻪ ﺍﻱ ﻣﺸﺨﺺ ﺍﺯ ﺍﻋﺪﺍﺩ ﭘﺸﺖ ﺳﺮ ﻫﻢ ﺭﺍ ﺩﺭ ﻃﻴﻒ ﻣﺸﺨﺼﻲ ﺍﻳﺠﺎﺩ ﻣﻲ ﮐﻨﺪ
:ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ
.1ﻣﺜﺎﻝ
Empty ﻋﻤﻠﮕﺮ
: ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ. ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺗﻬﻲ ﺍﺯ ﻳﮏ ﻧﻮﻉ ﻣﺸﺨﺺ ﺭﺍ ﺍﻳﺠﺎﺩ ﻣﻲ ﮐﻨﺪEmpty ﻋﻤﻠﮕﺮ
. ﺍﻳﺠﺎﺩ ﮐﺮﺩﻩ ﻭ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﮐﻨﺪIEnumerable<TResult> ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﺠﻤﻮﻋﻪ ﺍﻱ ﺗﻬﻲ ﺍﺯ ﻧﻮﻉ
.ﻣﺜﺎﻝ
ﻋﻤﻠﮕﺮ Distinct
ﻋﻤﻠﮕﺮ Distinctﻋﻨﺎﺻﺮ ﺗﮑﺮﺍﺭﻱ ﻣﻮﺟﻮﺩ ﺩﺭ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺣﺬﻑ ﻣﻲ ﮐﻨﺪ ﮐﻪ ﻣﻌﺪﻝ ﻣﺎﺩﻩ DISTICTﺩﺭ SQLﺍﺳﺖ ﮐﻪ
ﺩﺭ Joinﺍﺯ ﺁﻥ ﺍﺳﺘﻔﺎﺩﻩ ﺯﻳﺎﺩﻱ ﻣﻲ ﺷﻮﺩ .ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺍﺭﺍﻱ ﺩﻭ ﺳﺮﺑﺎﺭﮔﺰﺍﺭﻱ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ:
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺮﺍﻱ ﺍﻧﺠﺎﻡ ﻋﻤﻠﻴﺎﺕ ﺩﺭ ﺍﺑﺘﺪﺍ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ > IEnumerable<TSourceﺍﻳﺠﺎﺩ ﻣﻲ ﮐﻨﺪ ﺳﭙﺲ ﻋﻨﺎﺻﺮ
ﻣﺠﻤﻮﻋﻪ sourceﺭﺍ ﺷﻤﺎﺭﺵ ﮐﺮﺩﻩ ﻭ ﻋﻨﺎﺻﺮﻱ ﮐﻪ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ ﻭﺟﻮﺩ ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﻨﺪ ﺑﻪ ﺁﻥ ﺍﺿﺎﻓﻪ ﻣﻲ ﮔﺮﺩﻧﺪ ﮐﻪ ﺩﺭ
ﺑﺮﺭﺳﻲ ﻋﻨﺎﺻﺮ ﺑﺮﺍﻱ ﺗﮑﺮﺍﺭﻱ ﻧﺒﻮﺩﻥ ﺍﺯ ﻣﺘﺪﻫﺎﻱ GetHashCodeﻭ Equalﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﺷﻮﺩ ﮐﻪ ﻣﻲ ﺗﻮﺍﻥ ﺑﺮﺍﻱ ﺑﺮﺭﺳﻲ
IEqulityComparer ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺍﺯ ﻳﮏ ﻣﻘﺎﻳﺴﻪ ﮐﻨﻨﺪﻩ ﺳﻔﺎﺭﺷﻲ ﺍﺳﺘﻔﺎﺩﻩ ﻧﻤﻮﺩ .ﻣﻘﺎﻳﺴﻪ ﺳﻔﺎﺭﺷﻲ ﻣﻲ ﺑﺎﻳﺴﺖ ﺭﺍﺑﻂ
ﺭﺍﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﻧﻤﻮﺩﻩ ﺑﺎﺷﺪ.
ﻣﺜﺎﻝ.1
= var expr
(from c in customers
from o in c.Orders
join p in products
on o.IdProduct equals p.IdProduct
select p
;)().Distinct
www.AliAghdam.ir | ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ63 ﺻﻔﺤﻪ
Intersect ﻋﻤﻠﮕﺮ
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺍﺭﺍﻱ ﺩﻭ ﺳﺮﺑﺎﺭﮔﺰﺍﺭﻱ.ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺍﺯ ﺩﻭ ﻣﺠﻤﻮﻋﻪ ﻓﻘﻂ ﻋﻨﺎﺻﺮﻱ ﮐﻪ ﺩﺭ ﻫﺮ ﺩﻭ ﻣﻮﺟﻮﺩ ﺑﺎﺷﻨﺪ ﺭﺍ ﺑﺮﻣﻲ ﮔﺮﺩﺍﻧﺪ
:ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ
first ﺭﺍ ﺍﻳﺠﺎﺩ ﻣﻲ ﮐﻨﺪ ﻭ ﺳﭙﺲ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪIEnumerable<TSource> ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ ﺍﺑﺘﺪﺍ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺍﺯ ﻧﻮﻉ
ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﻋﻨﺼﺮﻱ ﺩﺭ ﻫﺮ ﺩﻭ ﻣﺠﻤﻮﻋﻪ ﻣﺸﺘﺮﮎ، ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﮐﻨﺪsecond ﺭﺍ ﺗﮏ ﺑﻪ ﺗﮏ ﺧﻮﺍﻧﺪﻩ ﻭ ﺑﺎ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ
ﺩﺭ ﻓﺮﻡ ﻧﺨﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺮﺭﺳﻲ ﻣﺸﺘﺮﮎ ﺑﻮﺩﻥ ﻋﻨﺎﺻﺮ ﺑﻪ ﻭﺳﻴﻠﻪ ﻣﺘﺪﻫﺎﻱ.ﺑﺎﺷﺪ ﺑﻪ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ ﺍﺿﺎﻓﻪ ﻣﻲ ﮔﺮﺩﺩ
ﺭﺍIEqualityComparer ﺍﻧﺠﺎﻡ ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﻣﻲ ﺗﻮﺍﻥ ﺍﺯ ﻳﮏ ﻣﻘﺎﻳﺴﻪ ﮐﻨﻨﺪﻩ ﺳﻔﺎﺭﺷﻲ ﮐﻪ ﺭﺍﺑﻂEqual ﻭGetHashCode
. ﺑﺮﺍﻱ ﻣﻘﺎﻳﺴﻪ ﻋﻨﺎﺻﺮ ﺍﺳﺘﻔﺎﺩﻩ ﻧﻤﻮﺩ،ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﺮﺩﻩ ﺑﺎﺷﺪ
ﻋﻤﻠﮕﺮ Union
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺎﺻﺮ ﺩﻭ ﻣﺠﻮﻋﻪ ﻣﺘﻔﺎﻭﺕ ﺭﺍ ﺑﻪ ﻳﮑﺪﻳﮕﺮ ﻣﺘﺼﻞ ﻣﻲ ﮐﻨﺪ ﻭ ﺩﺍﺭﺍﻱ ﺩﻭ ﺳﺮﺑﺎﺭﮔﺰﺍﺭﻱ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ:
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻠﮕﺮﻫﺎﻱ Distinctﻭ Intersectﺩﺭ ﺍﺑﺘﺪﺍ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺍﺯ ﻧﻮﻉ > IEnumerable<TSourceﺭﺍ
ﺍﻳﺠﺎﺩ ﻣﻲ ﮐﻨﺪ ﻭ ﺳﭙﺲ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ firstﺭﺍ ﺗﮏ ﺑﻪ ﺗﮏ ﺧﻮﺍﻧﺪﻩ ﻭ ﻋﻨﺎﺻﺮ ﻏﻴﺮ ﺗﮑﺮﺍﺭﻱ ﺭﺍ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ ﻗﺮﺍﺭ ﻣﻲ
ﺭﺍ ﺗﮏ ﺑﻪ ﺗﮏ ﺧﻮﺍﻧﺪﻩ ﻭ ﺑﺎ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﮐﻨﺪ ،ﻭ ﺩﺭ ﺻﻮﺭﺗﻲ second ﺩﻫﺪ ﺳﭙﺲ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ
ﮐﻪ ﻋﻨﺼﺮﻱ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ ﻭﺟﻮﺩ ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﺪ ﺑﻪ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ ﺍﺿﺎﻓﻪ ﻣﻲ ﮔﺮﺩﺩ .ﺩﺭ ﻓﺮﻡ ﻧﺨﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺮﺭﺳﻲ
ﻣﺸﺘﺮﮎ ﺑﻮﺩﻥ ﻋﻨﺎﺻﺮ ﺑﻪ ﻭﺳﻴﻠﻪ ﻣﺘﺪﻫﺎﻱ GetHashCodeﻭ Equalﺍﻧﺠﺎﻡ ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﻣﻲ ﺗﻮﺍﻥ ﺍﺯ ﻳﮏ ﻣﻘﺎﻳﺴﻪ ﮐﻨﻨﺪﻩ
ﺳﻔﺎﺭﺷﻲ ﮐﻪ ﺭﺍﺑﻂ IEqualityComparerﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﺮﺩﻩ ﺑﺎﺷﺪ ،ﺑﺮﺍﻱ ﻣﻘﺎﻳﺴﻪ ﻋﻨﺎﺻﺮ ﺍﺳﺘﻔﺎﺩﻩ ﻧﻤﻮﺩ.
ﻣﺜﺎﻝ.
ﻋﻤﻠﮕﺮ Except
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺎﺻﺮ ﻳﮏ ﻣﺠﻮﻋﻪ ﺭﺍ ﮐﻪ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺩﻳﮕﺮ ﻭﺟﻮﺩ ﻧﺪﺍﺷﺘﻪ ﺑﺎﺷﺪ ﺭﺍ ﺑﻪ ﺧﺮﻭﺟﻲ ﺍﺭﺳﺎﻝ ﻣﻲ ﮐﻨﺪ ﻭ ﺩﺍﺭﺍﻱ ﺩﻭ
ﺳﺮﺑﺎﺭﮔﺰﺍﺭﻱ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ:
first ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ ﺍﺑﺘﺪﺍ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺍﺯ ﻧﻮﻉ > IEnumerable<TSourceﺭﺍ ﺍﻳﺠﺎﺩ ﻣﻲ ﮐﻨﺪ ﻭ ﺳﭙﺲ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ
ﺭﺍ ﺗﮏ second ﺭﺍ ﺗﮏ ﺑﻪ ﺗﮏ ﺧﻮﺍﻧﺪﻩ ﻭ ﻋﻨﺎﺻﺮ ﻏﻴﺮ ﺗﮑﺮﺍﺭﻱ ﺭﺍ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ ﻗﺮﺍﺭ ﻣﻲ ﺩﻫﺪ ﺳﭙﺲ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ
ﺑﻪ ﺗﮏ ﺧﻮﺍﻧﺪﻩ ﻭ ﺑﺎ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﮐﻨﺪ ،ﻭ ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﻋﻨﺼﺮﻱ ﺩﺭ ﻣﺠﻤﻮﻋﻪ secondﺑﺎ ﻋﻨﺼﺮﻱ ﺩﺭ
ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ ﻣﺸﺘﺮﮎ ﺑﺎﺷﺪ ،ﺁﻥ ﻋﻨﺼﺮ ﺍﺯ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ ﺣﺬﻑ ﻣﻲ ﮔﺮﺩﺩ .ﺩﺭ ﻓﺮﻡ ﻧﺨﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺮﺭﺳﻲ ﻣﺸﺘﺮﮎ
ﺑﻮﺩﻥ ﻋﻨﺎﺻﺮ ﺑﻪ ﻭﺳﻴﻠﻪ ﻣﺘﺪﻫﺎﻱ GetHashCodeﻭ Equalﺍﻧﺠﺎﻡ ﻣﻲ ﺷﻮﺩ ﻭﻟﻲ ﻣﻲ ﺗﻮﺍﻥ ﺍﺯ ﻳﮏ ﻣﻘﺎﻳﺴﻪ ﮐﻨﻨﺪﻩ ﺳﻔﺎﺭﺷﻲ
ﮐﻪ ﺭﺍﺑﻂ IEqualityComparerﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﺮﺩﻩ ﺑﺎﺷﺪ ،ﺑﺮﺍﻱ ﻣﻘﺎﻳﺴﻪ ﻋﻨﺎﺻﺮ ﺍﺳﺘﻔﺎﺩﻩ ﻧﻤﻮﺩ.
ﺗﻮﺟﻪ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ﮐﻪ ﻣﺠﻤﻮﻋﻪ ﺧﺮﻭﺟﻲ ﺩﺭ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﺠﻤﻮﻋﻪ ﺍﻱ ﺷﺎﻣﻞ ﺗﻤﺎﻡ ﻋﻨﺎﺻﺮ ﻏﻴﺮ ﻣﺸﺘﺮﮎ ﻣﺠﻤﻮﻋﻪ firstﺑﺎ
secondﺍﺳﺖ.
ﻣﺜﺎﻝ.
//output
//2
//8
//13
66|ﺻﻔﺤﻪ LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
ﺑﻪ ﻋﻨﻮﺍﻥ ﻣﺜﺎﻝ ﺩﺭ ﺩﻭ ﻣﺠﻤﻮﻋﻪ ﺯﻳﺮ ﻳﮑﻲ ﺍﺯ ﻣﺸﺘﺮﻳﺎﻥ ﺍﺯ ﻧﻈﺮ ﻣﻌﻨﺎﻳﻲ ﺩﺭ ﻫﺮ ﺩﻭ ﻣﺠﻤﻮﻋﻪ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ﻭﻟﻲ ﺑﻮﺳﻴﻠﻪ ﺍﻳﻦ
:ﺗﻮﺍﺑﻊ ﺑﻪ ﺍﺷﺘﺒﺎﻩ ﺍﻧﺘﺨﺎﺏ ﻣﻲ ﮔﺮﺩﺩ
Customer[] customerSetOne = {
new Customer {CustomerID = 46, Name = "Ali" , Family = "Aghdam"},
new Customer {CustomerID = 27, Name = "Vali" , Family = "piriZadeh" },
new Customer {CustomerID = 14, Name = "Majid" , Family = "Shah Mohammadi"}};
Customer[] customerSetTwo = {
new Customer {CustomerID = 23, Name = "Mohammad" , Family = "Ajhdari"},
new Customer {CustomerID = 22, Name = "Hossein" , Family = "Aghdam" },
new Customer {CustomerID = 46, Name = "Ali" , Family = "Aghdam"}};
//output
//Name = Ali , Family = Aghdam , CustomerID = 46
//Name = Vali , Family = piriZadeh , CustomerID = 27
//Name = Majid , Family = Shah Mohammadi , CustomerID = 14
//Name = Mohammad , Family = Ajhdari , CustomerID = 23
//Name = Hossein , Family = Aghdam , CustomerID = 22
//Name = Ali , Family = Aghdam , CustomerID = 46
ﺩﺭ ﺯﻳﺮ. ﺭﺍ ﺑﺎﺯﻧﻮﻳﺴﻲ ﻧﻤﻮﺩGetHashCode ﺑﺮﺍﻱ ﺍﺟﺘﻨﺎﺏ ﺍﺯ ﻣﺸﮑﻞ ﻣﻲ ﺗﻮﺍﻥ ﻳﺎ ﺍﺯ ﻓﺮﻡ ﺩﻭﻡ ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ ﻭ ﻳﺎ ﻣﺘﺪ ﻫﺎﻱ
:ﺍﻳﻦ ﺗﻮﺍﺑﻊ ﺭﺍ ﺑﺎﺯﻧﻮﻳﺴﻲ ﻧﻤﻮﺩﻩ ﺍﻳﻢ
public class Customer
{
public int CustomerID;
public string Name;
public string Family;
else
{
Customer p = (Customer)obj;
return p.CustomerID == this.CustomerID ;
}
}
public override int GetHashCode()
{
return String.Format("{0}", this.CustomerID)
.GetHashCode();
}
Zip ﻋﻤﻠﮕﺮ
ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ. ﺑﻪ ﺧﺎﻧﻮﺍﺩﻩ ﻋﻤﻠﮕﺮﻫﺎﻱ ﺗﻨﻈﻴﻢ ﮐﻨﻨﺪﻩ ﺍﺿﺎﻓﻪ ﺷﺪﻩ ﺍﺳﺖ.NET 4 ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ
:ﺍﺳﺖ
ﺭﺍ ﺑﺎ ﻳﮑﺪﻳﮕﺮ ﺍﺩﻏﺎﻡsecond ﺩﺭ ﻣﺠﻤﻮﻋﻪ، ﺭﺍ ﺑﺎ ﻋﻨﺎﺻﺮ ﻣﺘﻨﺎﻇﺮ ﻣﺘﻨﺎﻇﺮ ﺑﻮﺳﻴﻠﻪ ﺍﻧﺪﻳﺲfirst ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ
ﺑﻪ ﻃﻮﺭﻱ ﮐﻪ ﺩﻭ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﻪ ﻳﮏ، ﺑﻪ ﺧﺎﻃﺮ ﺷﺒﺎﻫﺖ ﺁﻥ ﺑﻪ ﺯﻳﭗ ﺑﻮﺩﻩ ﺍﺳﺖZip ﺩﻟﻴﻞ ﻧﺎﻡ ﮔﺰﺍﺭﻱ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ.ﻣﻲ ﮐﻨﺪ
. ﺗﺒﺪﻳﻞ ﻣﻲ ﮐﻨﺪ، ﺑﺪﻭﻥ ﺗﻐﻴﻴﺮ ﻣﻮﻗﻌﻴﺖ،ﻣﺠﻤﻮﻋﻪ
68|ﺻﻔﺤﻪ LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
.ﻣﺜﺎﻝ
Int32[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
DayOfWeek[] weekDays = {
DayOfWeek.Sunday,
DayOfWeek.Monday,
DayOfWeek.Tuesday,
DayOfWeek.Wednesday,
DayOfWeek.Thursday,
DayOfWeek.Friday,
DayOfWeek.Saturday};
//output
//1 - Sunday
//2 - Monday
//3 - Tuesday
//4 - Wednseday
//5 - Thursday
//6 - Friday
//7 - Saturday
All ﻋﻤﻠﮕﺮ
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺗﻤﺎﻣﻲ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺎ ﻳﮏ ﺷﺮﻁ ﺑﺮﺭﺳﻲ ﻣﻲ ﮐﻨﺪ ﻭ ﺩﺭ ﺻﻮﺭﺗﻲ ﺗﻤﺎﻣﻲ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺷﺮﻁ ﺭﺍ
: ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ. ﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪtrue ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﻘﺪﺍﺭ،ﺑﺮﻗﺮﺍﺭ ﮐﻨﻨﺪ
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ ﺯﻣﺎﻥ ﺍﺟﺮﺍ ﮐﻠﻴﻪ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ sourceﺭﺍ ﺑﺎ ﺷﺮﻁ predicateﺑﺮﺭﺳﻲ ﻣﻲ ﮐﻨﺪ ﻭ ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﻫﻤﻪ
ﻱ ﻋﻨﺎﺻﺮ ﺷﺮﻁ ﺭﺍ ﺑﺮﻗﺮﺍﺭ ﮐﻨﻨﺪ ،ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﻘﺪﺍﺭ trueﺭﺍ ﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ ﻭ ﺩﺭ ﻏﻴﺮ ﺍﻳﻨﺼﻮﺭﺕ ﻣﻘﺪﺍﺭ falseﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ
ﺷﻮﺩ.
ﻣﺜﺎﻝ.
;)Console.WriteLine(query
//output
//False
ﻋﻤﻠﮕﺮ Any
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﺎ ﻳﮏ ﺷﺮﻁ ﺑﺮﺭﺳﻲ ﻣﻲ ﮐﻨﺪ ﻭ ﺩﺭ ﺻﻮﺭﺗﻲ ﻋﻨﺼﺮﻱ ﺷﺮﻁ ﺭﺍ ﺑﺮﻗﺮﺍﺭ ﮐﻨﻨﺪ ،ﺍﻳﻦ ﻋﻤﻠﮕﺮ
ﻣﻘﺪﺍﺭ trueﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ .ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ:
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ ﺯﻣﺎﻥ ﺍﺟﺮﺍ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ sourceﺭﺍ ﺑﺎ ﺷﺮﻁ predicateﺑﺮﺭﺳﻲ ﻣﻲ ﮐﻨﺪ ﻭ ﺩﺭ ﺻﻮﺭﺗﻲ ﻋﻨﺼﺮﻱ ﺷﺮﻁ
ﺭﺍ ﺑﺮﻗﺮﺍﺭ ﮐﻨﻨﺪ ،ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﻘﺪﺍﺭ trueﺭﺍ ﺑﺮ ﻣﻲ ﮔﺮﺩﺍﻧﺪ ﻭ ﺩﺭ ﻏﻴﺮ ﺍﻳﻨﺼﻮﺭﺕ ﻣﻘﺪﺍﺭ falseﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﻲ ﺷﻮﺩ.
|ﺻﻔﺤﻪ70 LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
ﻣﺜﺎﻝ.
;)Console.WriteLine(query
//output
//True
ﻋﻤﻠﮕﺮ Contains
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺑﻪ ﺩﻧﺒﺎﻝ ﻳﮏ ﻋﻨﺼﺮ ﻣﺸﺨﺺ ﻣﻲ ﮔﺮﺩﺩ ﻭ ﺩﺭ ﺻﻮﺭﺕ ﻭﺟﻮﺩ ،ﻣﻘﺪﺍﺭ trueﺭﺍ ﺑﺮﻣﻲ ﮔﺮﺩﺍﻧﺪ.
ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ:
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭﻫﻨﮕﺎﻡ ﺍﺟﺮﺍ ﺍﺑﺘﺪﺍ ﺑﺮﺭﺳﻲ ﻣﻲ ﮐﻨﺪ ﮐﻪ ﻣﺠﻤﻮﻋﻪ sourceﺭﺍﺑﻂ > ICollection<Tﺭﺍ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﺮﺩﻩ ﺑﺎﺷﺪ
ﺩﺭ ﺍﻳﻨﺼﻮﺭﺕ ﺍﺯ ﻣﺘﺪ Containﻣﺮﺑﻮﻁ ﺑﻪ ﺍﻳﻦ ﺭﺍﺑﻂ ﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﮐﻨﺪ ﺩﺭ ﻏﻴﺮ ﺍﻳﻨﺼﻮﺭﺕ ﺗﻤﺎﻣﻲ ﺍﻋﻀﺎﺀ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺷﻤﺎﺭﺵ
ﻣﻲ ﮐﻨﺪ ﻭ ﺩﺭ ﺻﻮﺭﺕ ﻭﺟﻮﺩ ﻋﻨﺼﺮ ﺩﺭ ﻣﺠﻤﻮﻋﻪ sourceﻣﻘﺪﺍﺭ trueﺭﺍ ﺑﺮﻣﻲ ﮔﺮﺩﺍﻧﺪ .ﺍﻟﺒﺘﻪ ﺑﺮﺍﻱ ﭼﮏ ﮐﺮﺩﻥ ﻋﻨﺎﺻﺮ ﺍﺯ
ﺗﻮﺍﺑﻊ GetHashCodeﻭ Equalﺍﺳﺘﻔﺎﺩﻩ ﻣﻲ ﮐﻨﺪ )ﺑﺎ ﻭﺟﻮﺩ ﻫﻤﺎﻥ ﻣﺸﮑﻞ ﮐﻪ ﺩﺭ ﻗﺴﻤﺖ ﻋﻤﻠﮕﺮﻫﺎﻱ ﺗﻨﻈﻴﻢ ﮐﻨﻨﺪﻩ ﺗﻮﺿﻴﺢ
ﺩﺍﺩﻩ ﺷﺪ( ﻭﻟﻲ ﻣﻲ ﺗﻮﺍﻥ ﺗﻮﺳﻂ ﭘﺎﺭﺍﻣﺘﺮ compareﻣﻲ ﺗﻮﺍﻥ ﻣﻘﺎﻳﺴﻪ ﮐﻨﻨﺪﻩ ﺳﻔﺎﺭﺷﻲ ﺭﺍ ﺗﻨﻈﻴﻢ ﻧﻤﻮﺩ.
www.AliAghdam.ir | ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ71 ﺻﻔﺤﻪ
Console.WriteLine(query);
//output
//True
Cast ﻋﻤﻠﮕﺮ
: ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ.ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﻪ ﻳﮏ ﻧﻮﻉ ﻣﻌﻴﻦ ﺗﺒﺪﻳﻞ ﻣﻲ ﮐﻨﺪ
ﺗﺒﺪﻳﻞ ﮐﺮﺩﻩ ﻭ ﺩﺭ ﻳﮏ ﻧﻤﻮﻧﻪTResult ﺭﺍ ﺧﻮﺍﻧﺪﻩ ﻭ ﺁﻧﻬﺎ ﺭﺍ ﺑﻪ ﻧﻮﻉ ﺗﻌﻴﻴﻦ ﺷﺪﻩsource ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ
. ﻗﺮﺍﺭ ﻣﻲ ﺩﻫﺪIEnumerable<TResult> ﺟﺪﻳﺪ ﺍﺯ ﻧﻮﻉ
.ﻣﺜﺎﻝ
ToArray ﻋﻤﻠﮕﺮ
ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ. ﺗﺒﺪﻳﻞ ﻣﻲ ﮐﻨﺪT[] ﺭﺍ ﺑﻪ ﻳﮏ ﺁﺭﺍﻳﻪIEnumerable<T> ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺎﺻﺮ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺍﺯ ﻧﻮﻉ
:ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ
ﺗﺒﺪﻳﻞ ﻣﻲ ﮐﻨﺪ ﻭTSource ﺭﺍ ﺗﮏ ﺗﮏ ﺧﻮﺍﻧﺪﻩ ﻭ ﺑﻪ ﻧﻮﻉsource ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ ﺯﻣﺎﻥ ﺍﺟﺮﺍ ﺗﻤﺎﻣﻲ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ
. ﻗﺮﺍﺭ ﻣﻲ ﺩﻫﺪTSource[] ﺳﭙﺲ ﺩﺭ ﺁﺭﺍﻳﻪ ﺟﺪﻳﺪﻱ ﺍﺯ ﻧﻮﻉ
.ﻣﺜﺎﻝ
//output
//1
//3
//2
//3
//3
//1
//8
//13
www.AliAghdam.ir ﺻﻔﺤﻪ | 73ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ
ﻋﻤﻠﮕﺮ ToList
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻋﻨﺎﺻﺮ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺍﺯ ﻧﻮﻉ > IEnumerable<Tﺭﺍ ﺑﻪ ﻳﮏ ﻣﺠﻤﻮﻋﻪ > List<Tﺗﺒﺪﻳﻞ ﻣﻲ ﮐﻨﺪ .ﻓﺮﻡ ﮐﻠﻲ
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ:
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺩﺭ ﺯﻣﺎﻥ ﺍﺟﺮﺍ ﺗﻤﺎﻣﻲ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ sourceﺭﺍ ﺗﮏ ﺗﮏ ﺧﻮﺍﻧﺪﻩ ﻭ ﺩﺭ ﺑﻪ ﻧﻮﻉ TSourceﺗﺒﺪﻳﻞ ﻣﻲ ﮐﻨﺪ ﻭ
ﺳﭙﺲ ﺩﺭ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪﻱ ﺍﺯ ﻧﻮﻉ > List<TSourceﻗﺮﺍﺭ ﻣﻲ ﺩﻫﺪ.
ﻣﺜﺎﻝ.
//output
//1
//3
//2
//3
//3
//1
//8
//13
74|ﺻﻔﺤﻪ LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
ToDictionary ﻋﻤﻠﮕﺮ
ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﻪ. ﺗﺒﺪﻳﻞ ﻣﻲ ﮐﻨﺪDictionary<TKey, TSource> ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻳﮏ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﻪ ﻧﻮﻉ
:ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖ
Dictionary<TKey , ﺭﺍ ﺗﮏ ﺗﮏ ﺷﻤﺎﺭﺵ ﮐﺮﺩﻩ ﻭ ﻳﮏ ﻧﻮﻉ ﺟﺪﻳﺪ ﺍﺯ source ﺩﺭﻓﺮﻡ ﻧﺨﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﺠﻤﻮﻋﻪ
Key ﺍﺭﺯﻳﺎﺑﻲ ﻣﻲ ﺷﻮﻧﺪ ﻭ ﻣﻘﺪﺍﺭkeySelector ﺭﺍ ﺑﻮﺳﻴﻠﻪ ﺗﺎﺑﻊsource ﺍﻳﺠﺎﺩ ﻣﻲ ﮐﻨﺪ ﻭ ﺳﭙﺲ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪTSource>
ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻪValue ﻭ ﻳﺎ ﻫﻤﺎﻥTSource ﺭﺍ ﺗﻮﻟﻴﺪ ﻣﻲ ﮐﻨﺪ ﺳﭙﺲ ﻣﻘﺪﺍﺭ ﺁﻥ ﻋﻨﺼﺮ ﺑﻪ ﻋﻨﻮﺍﻥDictionary ﺑﺮﺍﻱ ﻣﺠﻤﻮﻋﻪ
. ...ﻣﻲ ﺷﻮﺩ ﻭ ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ
. ﺍﻣﮑﺎﻥ ﺗﻌﻴﻴﻦ ﻳﮏ ﺗﺎﺑﻊ ﻣﻘﺎﻳﺴﻪ ﮐﻨﻨﺪﻩ ﺳﻔﺎﺭﺷﻲ ﺭﺍ ﺗﻌﻴﻴﻦ ﻣﻲ ﮐﻨﺪcomparer ﺩﺭ ﻓﺮﻡ ﺩﻭﻡ ﭘﺎﺭﺍﻣﺘﺮ
. ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩValue ﻭ ﻳﺎ ﻫﻤﺎﻥTSource ﻣﻲ ﺗﻮﺍﻥ ﺑﺮﺍﻱ ﺗﻌﻴﻴﻦ ﻧﻮﻉelementSelector ﺩﺭ ﻓﺮﻡ ﺳﻮﻡ ﺍﺯ ﭘﺎﺭﺍﻣﺘﺮ
ﻣﻲ ﺗﻮﺍﻥ ﻧﻮﻉelementSelector ﻓﺮﻡ ﺁﺧﺮ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﺠﻤﻮﻋﻲ ﺍﺯ ﻓﺮﻡ ﻫﺎﻱ ﺩﻳﮕﺮ ﺍﺳﺖ ﻳﻌﻨﻲ ﺩﺭ ﺁﻥ ﺑﻮﺳﻴﻠﻪ
. ﻣﻲ ﺗﻮﺍﻥ ﺗﺎﺑﻊ ﻣﻘﺎﻳﺴﻪ ﮐﻨﻨﺪﻩ ﺳﻔﺎﺭﺷﻲ ﺭﺍ ﺗﻌﻴﻴﻦ ﮐﺮﺩcomparer ﺭﺍ ﺗﻌﻴﻴﻦ ﮐﺮﺩ ﻭ ﺑﻮﺳﻴﻠﻪ ﭘﺎﺭﺍﻣﺘﺮTSource
.ﻣﺜﺎﻝ
var customersDictionary =
customers
.ToDictionary(c => c.Name,
c => new { c.Name, c.City });
www.AliAghdam.ir | ﻓﺼﻞ ﺳﻮﻡ – ﻋﻤﻠﮕﺮﻫﺎﻱ ﺍﺳﺘﺎﻧﺪﺍﺭﺩ ﭘﺮﺱ ﻭ ﺟﻮ75 ﺻﻔﺤﻪ
ToLookup ﻋﻤﻠﮕﺮ
ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﮐﻠﻲ. ﻣﻮﺭﺩ ﺍﺳﺘﻔﺎﺩﻩ ﻗﺮﺍﺭ ﻣﻲ ﮔﻴﺮﺩLookup<K, T> ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﺑﺮﺍﻱ ﺗﺒﺪﻳﻞ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﻳﺎ ﻟﻴﺴﺖ ﺑﻪ ﻧﻮﻉ
: ﺑﻪ ﺻﻮﺭﺕ ﺯﻳﺮ ﺍﺳﺖLookup<K,T>
ﺍﺷﺎﺭﻩ ﮐﻨﺪ ﮐﻪ ﺍﻳﻦ ﺍﻣﮑﺎﻥ ﻓﺮﺍﻫﻢ ﺳﺎﺧﺘﻦ ﺳﺎﺧﺘﺎﺭT ﺍﻳﻦ ﺭﺍﺑﻂ ﺍﻳﻦ ﺍﻣﮑﺎﻥ ﺭﺍ ﻓﺮﺍﻫﻢ ﻣﻲ ﮐﻨﺪ ﻳﮏ ﮐﻠﻴﺪ ﻣﻲ ﺗﻮﺍﻧﺪ ﺑﻪ ﭼﻨﺪﻳﻦ
. ﺭﺍ ﻓﺮﺍﻫﻢ ﻣﻲ ﮐﻨﺪone-to-many
Lookup<TKey , ﺭﺍ ﺗﮏ ﺗﮏ ﺷﻤﺎﺭﺵ ﮐﺮﺩﻩ ﻭ ﻳﮏ ﻧﻮﻉ ﺟﺪﻳﺪ ﺍﺯsource ﺩﺭﻓﺮﻡ ﻧﺨﺴﺖ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﺠﻤﻮﻋﻪ
Key ﺍﺭﺯﻳﺎﺑﻲ ﻣﻲ ﺷﻮﻧﺪ ﻭ ﻣﻘﺪﺍﺭkeySelector ﺭﺍ ﺑﻮﺳﻴﻠﻪ ﺗﺎﺑﻊsource ﺍﻳﺠﺎﺩ ﻣﻲ ﮐﻨﺪ ﻭ ﺳﭙﺲ ﻋﻨﺎﺻﺮ ﻣﺠﻤﻮﻋﻪTSource>
ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻪValue ﻭ ﻳﺎ ﻫﻤﺎﻥTSource ﺭﺍ ﺗﻮﻟﻴﺪ ﻣﻲ ﮐﻨﺪ ﺳﭙﺲ ﻣﻘﺪﺍﺭ ﺁﻥ ﻋﻨﺼﺮ ﺑﻪ ﻋﻨﻮﺍﻥLookup ﺑﺮﺍﻱ ﻣﺠﻤﻮﻋﻪ
. ...ﻣﻲ ﺷﻮﺩ ﻭ ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ
|ﺻﻔﺤﻪ76 LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
ﺩﺭ ﻓﺮﻡ ﺩﻭﻡ ﭘﺎﺭﺍﻣﺘﺮ comparerﺍﻣﮑﺎﻥ ﺗﻌﻴﻴﻦ ﻳﮏ ﺗﺎﺑﻊ ﻣﻘﺎﻳﺴﻪ ﮐﻨﻨﺪﻩ ﺳﻔﺎﺭﺷﻲ ﺭﺍ ﺗﻌﻴﻴﻦ ﻣﻲ ﮐﻨﺪ.
ﺩﺭ ﻓﺮﻡ ﺳﻮﻡ ﺍﺯ ﭘﺎﺭﺍﻣﺘﺮ elementSelectorﻣﻲ ﺗﻮﺍﻥ ﺑﺮﺍﻱ ﺗﻌﻴﻴﻦ ﻧﻮﻉ TSourceﻭ ﻳﺎ ﻫﻤﺎﻥ Valueﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩ.
elementSelectorﻣﻲ ﺗﻮﺍﻥ ﻧﻮﻉ ﻓﺮﻡ ﺁﺧﺮ ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻣﺠﻤﻮﻋﻲ ﺍﺯ ﻓﺮﻡ ﻫﺎﻱ ﺩﻳﮕﺮ ﺍﺳﺖ ﻳﻌﻨﻲ ﺩﺭ ﺁﻥ ﺑﻮﺳﻴﻠﻪ
TSourceﺭﺍ ﺗﻌﻴﻴﻦ ﮐﺮﺩ ﻭ ﺑﻮﺳﻴﻠﻪ ﭘﺎﺭﺍﻣﺘﺮ comparerﻣﻲ ﺗﻮﺍﻥ ﺗﺎﺑﻊ ﻣﻘﺎﻳﺴﻪ ﮐﻨﻨﺪﻩ ﺳﻔﺎﺭﺷﻲ ﺭﺍ ﺗﻌﻴﻴﻦ ﮐﺮﺩ.
ﻣﺜﺎﻝ.
= var ordersByProduct
( from c in customers
from o in c.Orders
) select o
;).ToLookup(o => o.OrderID
ﻋﻤﻠﮕﺮ AsEnumerable
ﺍﻳﻦ ﻋﻤﻠﮕﺮ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺭﺍ ﺑﻪ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺍﺯ ﻧﻮﻉ > IEnumerable<TSourceﺗﺒﺪﻳﻞ ﻣﻲ ﮐﻨﺪ .ﻓﺮﻡ ﮐﻠﻲ ﺍﻳﻦ ﻋﻤﻠﮕﺮ
ﺑﻪ ﺍﻳﻦ ﺻﻮﺭﺕ ﺍﺳﺖ:
ﺍﻳﻦ ﺩﺳﺘﻪ ﺍﺯ ﻋﻤﻠﮕﺮ ﻫﺎ ﺑﻪ ﺍﺻﻄﻼﺡ ” “conversion on the flyﺧﻮﺍﻧﺪﻩ ﻣﻲ ﺷﻮﻧﺪ ﮐﻪ ﺍﻳﻦ ﺍﻣﮑﺎﻥ ﺭﺍ ﻓﺮﺍﻫﻢ ﻣﻲ ﮐﻨﻨﺪ ﮐﻪ
Customers ﺑﺘﻮﺍﻥ ﺗﻮﺍﺑﻊ ﺗﻮﺳﻌﻪ ﻋﺎﻡ ﺭﺍ ﺑﺮ ﺭﻭﻱ ﻧﻮﻉ ﻫﺎﻱ ﮐﻪ ﺗﻮﺍﺑﻌﻲ ﺑﺎ ﻫﻤﺎﻥ ﻧﺎﻡ ﺩﺍﺭﻧﺪ ،ﺍﺟﺮﺍ ﻧﻤﻮﺩ .ﺑﻪ ﻋﻨﻮﺍﻥ ﻣﺜﺎﻝ ﮐﻼﺱ
ﺭﺍ ﺑﺎ ﭘﻴﺎﺩﻩ ﺳﺎﺯﻱ ﺯﻳﺮ ﮐﻪ ﻳﮏ ﺗﺎﺑﻊ ﺗﻮﺳﻌﻪ Whereﺑﺮﺍﻱ ﺁﻥ ﺗﻌﺮﻳﻒ ﺷﺪﻩ ،ﺩﺭ ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ.
ﻣﺘﺪ ﻧﺘﻮﺳﻌﻪ ﺟﺪﻳﺪ ﺍﺟﺮﺍ ﺧﻮﺍﻫﺪ، ﺍﻧﺠﺎﻡ ﺩﻫﻴﻢCustomers ﺣﺎﻻ ﺍﮔﺮ ﺑﺨﻮﺍﻫﻴﻢ ﭘﺮ ﺳﻮ ﺟﻮﻱ ﺑﺮ ﺭﻭﻱ ﻳﮏ ﻧﻤﻮﻧﻪ ﺍﺯ ﺷﻲﺀ
: ﺑﻪ ﻣﺜﺎﻝ ﺯﻳﺮ ﺩﻗﺖ ﮐﻨﻴﺪ. ﻧﻤﻲ ﺗﻮﺍﻥ ﺍﺳﺘﻔﺎﺩﻩ ﻧﻤﻮﺩWhere ﺷﺪ ﻭ ﺍﺯ ﻣﺘﺪ
var expr =
from c in customersList
where c.Country == "iran"
select c;
//output
//Custom Where extension method
//Name = Ali , Family = Aghdam , CustomerID = 0
//Name = Vali , Family = piriZadeh , CustomerID =1
78|ﺻﻔﺤﻪ LINQ ﻣﺮﺟﻊ ﻳﺎﺩﮔﻴﺮﻱ www.AliAghdam.ir
ﻧﻴﺎﺯ ﺑﻪ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﻋﻤﻠﮕﺮ، ﺍﺟﺮﺍ ﮐﻨﻴﺪCustomers ﺭﺍ ﺑﺮﺭﻭﻱLINQ ﻣﺮﺑﻮﻁ ﺑﻪWhere ﺣﺎﻝ ﺍﮔﺮ ﺑﺨﻮﺍﻫﻴﺪ ﮐﻪ ﻣﺘﺪ ﻋﺎﻡ
. ﺍﺳﺘﻔﺎﺩﻩ ﺷﺪﻩ ﺍﺳﺖCustomers ﺑﺮ ﺭﻭﻱWhere ﺩﺭ ﭘﺮﺱ ﻭ ﺟﻮﻱ ﺯﻳﺮ ﺍﺯ ﻣﺘﺪ ﻋﺎﻡ. ﺧﻮﺍﻫﻴﺪ ﮐﺮﺩAsEnumerable
var expr =
from c in customersList.AsEnumerable()
where c.Country == "iran"
select c;
//output
//Name = Ali , Family = Aghdam , CustomerID = 0
//Name = Vali , Family = piriZadeh , CustomerID =1