Professional Documents
Culture Documents
LINQUyghurche V10 20090206
LINQUyghurche V10 20090206
cn ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕLINQ 1
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 2
ﻣﯘﻧﺪﻩﺭﯨﺠﻪ
SelectManyﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ43 .....................................................................
ﺋﺎﺗﺎﻟﻐﯘﻻﺭ ﺋﯩﺰﺍﮬﺎﺗﻰ
ﻣﻪﺯﻛــﯘﺭ ﻛﯩﺘــﺎﺑﻨﻰ ﺋﻮﻗــﯘﺵ ﺟﻪﺭﻳﺎﻧﯩــﺪﺍ ﭘــﺎﺕ-ﭘــﺎﺕ ﻛﯜﻟــﯜﭖ ﺗﯘﺭﯨــﺪﯨﻐﺎﻧﻠﯩﻘﯩﯖﯩﺰﻏﺎ ﺋﯩــﺸﻪﻧﭽﯩﻢ ﻛﺎﻣﯩــﻞ.
ﺋﻪﺳـــﻠﯩﺪﻩ ﺋﺎﺗـــﺎﻟﻐﯘﻻﺭ ﺋﯩﺰﺍﮬـــﺎﺗﻰ ﻣﻪﻥ ﻳﺎﺯﯨـــﺪﯨﻐﺎﻥ ﻣﻪﺯﻣـــﯘﻥ ﺋﻪﻣﻪﺱ ﺋﯩـــﺪﻯ ،ﻟـــﯧﻜﯩﻦ ﻛﻮﻣﭙﯩﻴـــﯘﺗﯧﺮ
ﺳﺎﮬﻪﺳــﯩﺪﯨﻜﻰ ﻛﻪﺳــﭙﯩﻲ ﺋﺎﺗــﺎﻟﻐﯘﻻﺭﻧﻰ ﺋﺎﺗــﺎﻟﻐﯘ ﺋﯩﺰﺍﮬــﺎﺕ ﻟــﯘﻏﻪﺗﻠﯩﺮﯨﻤﯩﺰﺩﯨﻦ ﺗﻮﻟــﯘﻕ ﺗﺎﭘﺎﻻﻳــﺪﯨﻐﺎﻥ
ﺑﻮﻟﯘﺷـــﯩﻤﯩﺰﻏﺎ ﻳﻪﻧﻪ ﺑﯩـــﺮ ﻣﻪﺯﮔﯩـــﻞ ﻛﯧﺘﯩـــﺪﯨﻐﺎﻥ ﺑﻮﻟﻐﺎﭼﻘـــﺎ ،ﺑﯩـــﺮ ﻗﯩـــﺴﯩﻢ ﻛﻪﺳـــﭙﻰ ﺋﺎﺗـــﺎﻟﻐﯘﻻﺭﻧﻰ
ﺟﯚﻳﻠﯜﺷــﯩﻤﯩﺰﮔﻪ ﺗــﻮﻏﺮﺍ ﻛﻪﻟــﺪﻯ .ﺷــﯘﯕﺎ ﻛﯩﺘــﺎﺏ ﻣﻪﺯﻣﯘﻧﯩــﺪﺍ ﺗﯚﯞﻩﻧــﺪﯨﻜﻰ ﺳــﯚﺯﻟﻪﺭﻧﻰ ﺋــﯘﭼﺮﺍﺗﻘﯩﻨﯩﯖﯩﺰﺩﺍ
ﻛﯜﻟﮕﻪﭺ ﺗﻮﻏﺮﺍ ﭼﯜﺷﯩﻨﻪﺭﺳﯩﺰ .ﺋﺎﺗﺎﻟﻐﯘ ﺗﻪﺭﺟﯩﻤﻪ ﺧﯩﺰﻣﯩﺘﯩﺪﻩ ﻗﯩﻤﻤﻪﺗﻠﯩﻚ ﭘﯩﻜﯩﺮﻟﻪﻧﻰ ﺑﻪﺭﮔﻪﻥ ﺋﯚﻣﻪﺭﺟـﺎﻥ
ﺋﺎﺑﺪﯗﺭﺍﺧﻤﺎﻥ )ﺋﯘﭼﻘﯘﻥ( ﺋﻪﭘﻪﻧﺪﯨﮕﻪ ﻛﯚﭖ ﺗﻪﺷﻪﻛﻜﯜﺭ.
ﺋﯚﻣﯜﺭ – ﺋﯧﻨﮕﻠﯩﺰﭼﯩـﺪﺍ ،lifetime :ﺧﻪﻧﺰﯗﭼﯩـﺪﺍ 生命周期 :ﺑﻮﻟـﯘﭖ ،ﺋﯚﻣـﯜﺭﻯ ﺩﯦـﮕﻪﻥ ﻣﻪﻧﯩـﺪﻩ .ﺋـﯘ
ﭘﺮﻭﮔﺮﺍﻣﻤﯩﺪﺍ ﻣﻪﻟﯘﻡ ﺋﯚﺯﮔﻪﺭﮔﯜﭼﻰ ﻣﯩﻘـﺪﺍﺭﻧﯩﯔ ﺋـﯚﺯﻯ ﺗﯘﺭﻏـﺎﻥ ﻛـﻮﺩ ﺑﯚﻟﯩﻜﯩـﺪﻩ ﺋﯜﻧﯜﻣﻠـﯜﻙ ﺑﻮﻻﻻﻳـﺪﯨﻐﺎﻥ
ﯞﺍﻗﯩــﺖ ﺋــﯘﺯﯗﻧﻠﯩﻘﯩﻨﻰ ﻛﯚﺭﺳــﯩﺘﯩﺪﯗ .ﻣﻪﺳــﯩﻠﻪﻥ ،ﺗﯚﯞﻩﻧــﺪﯨﻜﻰ ﭘﺮﻭﮔﺮﺍﻣﻤﯩــﺪﺍ ﺋﻮﺧــﺸﯩﻤﯩﻐﺎﻥ ﺋﻮﺭﯗﻧــﺪﺍ
ﺋﯧﻨﯩﻘﻼﻧﻐﺎﻥ ﺋﯚﺯﮔﻪﺭﮔﯜﭼﻰ ﻣﯩﻘﺪﺍﺭﻻﺭﻧﯩﯔ ﺋﯜﻧﯜﻣﻠﯜﻙ ﻣﻪﺯﮔﯩﻠﻰ ﺋﻮﺧﺸﺎﺵ ﺑﻮﻟﻤﺎﻳﺪﯗ.
public class MisalClass
{
public int ozgerguchi1 = 1;
public int misalFun()
{
int ozgerguchi2 = ozgerguchi1 + 1 ;
return ozgerguchi2;
}
}
ﺗﯜﺭ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩﺴﻰ ،Class[klɑ:s] :ﺧﻪﻧﺰﯗﭼﯩﺴﻰ 类 :ﺑﻮﻟﯘﭖ .ﺗﯩﭗ ،ﺗﯜﺭ ﺩﯦﮕﻪﻥ ﻣﻪﻧﯩﺪﻩ .ﻟـﯧﻜﯩﻦ
ﺑﯘ ﺗﯩﭗ (类型)Typeﺑﯩﻠﻪﻥ ﺩﻭﻗﺎﻝ ﻛﯧﻠﯩﭗ ﻗﺎﻟﻐﺎﻧﻠﯩﻘﻰ ﺋﯜﭼﯜﻥ ﺗﯜﺭ ﺩﻩﭖ ﺋﯧﻠﯩﻨﺪﻯ .ﺋﯘﻧﯩﯖﺪﯨﻦ ﺑﺎﺷـﻘﺎ
project, 项目ﻧﯩﻤﯘ ﺗﯜﺭ ﺩﻩﭖ ﺋﯧﻠﯩﺶ ﻣﯘﯞﺍﭘﯩﻖ ،ﺷﯘﯕﺎ ﺑﯘ ﻛﯩﺘﺎﭘﺘـﺎ »ﺗـﯜﺭ« ﮬﻪﻡ classﮬﻪﻡ project
ﺩﯦــﮕﻪﻥ ﻣﻪﻧﯩﻠﻪﺭﻧــﻰ ﺑﯧﺮﯨــﺪﯗ .ﺯﺍﺩﻯ ﻗﺎﻳــﺴﻰ ﻣﻪﻧﯩــﺪﻩ ﻛﻪﻟﮕﻪﻧﻠﯩــﺪﻯ ﺋــﯚﺯﻯ ﺗﯘﺭﯗﺷــﻠﯘﻕ ﻣﻪﺯﻣﯘﻧــﺪﯨﻦ
ﻛﻪﻟﺘﯜﺭﯛﯞﯦﻠﯩﺪﯗ.
ﺋﻪﺯﺍ – ﺋﯩﻨﮕﻠﯩﺰﭼﯩـــﺴﻰ ،Item :ﺧﻪﻧﺰﯗﭼﯩـــﺴﻰ 项 :ﺑﻮﻟـــﯘﭖ ،ﻣﻪﻟـــﯘﻡ ﺗﯩﺰﻣـــﺎ ﺋﯩﭽﯩـــﺪﯨﻜﻰ ﺑﯩـــﺮ ﺩﺍﻧﻪ
ﺋﯧﻠﯧﻤﻨﯧﺘﻨــﻰ ﻛﯚﺭﺳــﯩﺘﯩﺪﯗ .ﻣﻪﺳــﯩﻠﻪﻥ } int[] sanlar = new int[]{1,2,3,4ﺩﻩﭖ
ﺋﯧﻨﯩﻘﻼﻧﺴﺎ1,2,3 ،ﯞﻩ 4ﻟﻪﺭ sanlarﻧﯩﯔ ﺋﻪﺯﺍﻟﯩﺮﯨﺪﯗﺭ.
ﺋﻪﺳﻜﻪﺭﺗﯩﺶ :ﻳﯘﻗﯩﺮﯨﻘﻰ ﺋﺎﺗﺎﻟﻐﯘﻻﺭ ﺑﯩﺮﺩﻩﻙ ﺑﯩﺮ ﻗﯩﺴﯩﻢ ﻛﻪﺳﯩﭙﺪﺍﺷﻼﺭ ﺑﯩـﻠﻪﻥ ﭘﯩﻜﯩﺮﻟﯩـﺸﯩﺶ ﺋﺎﺳﺎﺳـﯩﺪﺍ
ﺗﻪﺭﺟﯩﻤﻪ ﻗﯩﻠﯩﻨﻐﺎﻥ ،ﻣﯘﺷﯘ ﻛﯩﺘﺎﺑﺘﯩﻦ ﺑﺎﺷﻘﺎ ﮬﻪﺭﻗﺎﻧﺪﺍﻕ ﻣﺎﺗﯧﺮﻳﺎﻟﻼﺭﺩﯨﻜﻰ ﺋﻮﺧﺸﺎﺵ ﺋﺎﺗﺎﻟﻐﯘﻻﺭﻏﺎ ﺋﺎﺳﺎﺱ
ﺑﻮﻻﻟﻤﺎﻳــﺪﯗ .ﮬﻪﻡ ﻣﻪﺯﻛــﯘﺭ ﺗﻪﺭﺟﯩﻤﯩــﻠﻪﺭ ﺳــﻪﯞﻩﺑﻠﯩﻚ ﻛﯧﻠﯩــﭗ ﭼﯩﻘﻘــﺎﻥ ﮬﻪﺭﻗﺎﻧــﺪﺍﻕ ﻣﻪﺳــﺌﯘﻟﯩﻴﻪﺗﻨﻰ
ﺋﯜﺳﺘﯩﻤﯩﺰﮔﻪ ﺋﺎﻟﻤﺎﻳﻤﯩﺰ.
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 10
ﻛﯚﭘﻤﺎﺳﻠﯩﻖ
ﻧﯘﺭﻏﯘﻥ ﭘﺮﻭﮔﺮﺍﻣﻤﺎ ﺗﯩﻠﻠﯩﺮﯨﺪﺍ ﺋﯚﺯﮔﻪﺭﮔﯜﭼﻰ ﻣﯩﻘﺪﺍﺭ ﯞﻩ ﺋﻮﺑﻴﯧﻜﯩﺘﻼﺭﻧﻰ ﻛﻮﻧﺘﺮﻭﻝ ﻗﯩﻠﯩﺶ ﺋﯜﭼـﯜﻥ ﺋﯧﻨﯩـﻖ
ﺗﯩﭗ ﯞﻩ ﺗﯩﭙﻼﺭﻧﻰ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺷﻘﺎ ﻛﻪﺳﻜﯩﻦ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻗﺎﺋﯩﺪﯨﻠﯩﺮﻯ ﺑﯧﻜﯩـﺘﯩﻠﮕﻪﻥ .ﺋﻮﻣﯘﻣﻼﺷـﺘﯘﺭﯗﺵ
ﻧﯘﺧﺘﯩـــﺴﯩﺪﯨﻦ ﺋﯧﻴﺘﻘﺎﻧـــﺪﺍ ،ﻗـــﺎﺗﺘﯩﻖ ﺗﯩﭙﻠﯩـــﻖ ﺗﯩﻠـــﻼﺭﺩﺍ ﻳﯧﺰﯨﻠﻐـــﺎﻥ ﻛـــﻮﺩﻻﺭﺩﺍ ﺑﻪﺯﻯ ﻧﻮﻗـــﺴﺎﻧﻼﺭﻧﯩﯔ
ﺳﺎﻗﻼﻧﻐﺎﻧﻠﯩﻘﯩﻨﻰ ﺑﺎﻳﻘﺎﻳﻤﯩﺰ .ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻛﻮﺩﻗﺎ ﻗﺎﺭﺍﻳﻠﻰ:
int Min( int a, int b ) {
if (a < b) return a;
else return b;
}
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;
}
ﮔﻪﺭﭼﻪ ﻣﻪﺳﯩﻠﯩﻨﻰ ﺩﻩﻣﺎﻟﻠﯩﻖ ﮬﻪﻝ ﻗﯩﻠﻐﺎﻥ ﺑﻮﻟﺴﺎﻗﻤﯘ ،ﻟﯧﻜﯩﻦ ﭼﻮﯓ ﭘﯧﺸﻜﻪﻟﺪﯨﻦ ﺑﯩﺮﻧﻰ ﺗﯧﺮﯨﺪﯗﻕMin :
ﻓﯘﻧﻜﯩﺴﯩﻴﯩﺴﻰ ﺋﯩﺠﺮﺍ ﺟﻪﺭﻳﺎﻧﯩﺪﺍ ﺋﯚﺗﻜﯜﻧﭽﻰ ﺗﯩﭗ ﮬﺎﺳﯩﻞ ﻗﯩﻠﯩﭗ ﻗﻮﻳﺪﻯ .ﻳﻪﻧﻰ ،ﻣﻪﺳﯩﻠﻪﻥ Min ،ﻧﻰ
ﺋﯩﺸﻠﻪﺗﻜﯜﭼﯩﻨﯩﯔ ﺋﯘﻧﯩﯖﻐﺎ ﺋﯩﻜﻜﻰ ﺩﺍﻧﻪ intﺗﯩﭙﻠﯩﻖ ﭘﯜﺗﯜﻥ ﺳﺎﻥ ﻳﻮﻟﻠﯩﺸﻰ intﺩﯨﻦ IComparableﻏـﺎ
ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻣﻪﺷﻐﯘﻻﺗﯩﻨﻰ ﻛﻪﻟﺘﯜﺭﯛﭖ ﭼﯩﻘﯩﺮﯨـﺪﯗ ،ﻟـﯧﻜﯩﻦ ﺑـﯘ ﺟﻪﺭﻳـﺎﻥ ﺋﯧـﻨﯩﻘﻼ ﺋـﺎﺭﺗﯘﻗﺘﯩﻦ-ﺋـﺎﺭﺗﯘﻕ
CPUﭼﯩﻘﯩﻤﻰ ﺗﻪﻟﻪﭖ ﻗﯩﻠﯩﺪﯗ .ﮬﻪﺗﺘﺎ ﺑﻪﺯﯨﺪﻩ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ) (Exceptionﭼﯩﻘﯩﺮﯨﺸﯩﻤﯘ ﻣﯘﻣﻜﯩﻦ.
int a = 5, b = 10;
int c = (int) Min( a, b );
ﺗﯩﭗ ﺭﻩﺗﻠﻪﺵ ﯞﻩﺯﯨﭙﯩﺴﯩﻨﻰ ﮬﺎﺯﯨﺮ ﺟﺎﯞﺍﺏ ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤﺎﻧﻐـﺎ ﺗﺎﭘـﺸﯘﺭﯗﺵ ﻳﺎﺧـﺸﻰ ﻗـﺎﺭﺍﺭ .ﭼـﯜﻧﻜﻰ :ﺋـﯘ
ﺋﻮﺧﺸﺎﺵ ﻛﻮﺩﻧﯩﯔ ﺋﻮﺧﺸﯩﻤﯩﻐﺎﻥ ﻧﯘﺳﺨﯩﻠﯩﺮﯨﻨﻰ ﮬﺎﺳﯩﻞ ﻗﯩﻼﻻﻳﺪﯗ ،ﺷﯘﯕﺎ ﺋﻮﺧـﺸﯩﻤﯩﻐﺎﻥ ﻧﯘﺳـﺨﯩﺪﯨﻜﻰ
ﻛﻮﺩﻧﻰ ﺋﻮﺧـﺸﯩﻤﯩﻐﺎﻥ ﺗﯩﭙﻼﺭﻏـﺎ ﺋﯩـﺸﻠﻪﺗﻜﯩﻠﻰ ﺑﻮﻟﯩـﺪﯗ .ﺑـﯘ ﺋﯘﺳـﯘﻝ ﻣـﺎﻛﺮﻭﻟﯘﻕ ﻛﯧﯖﻪﻳﺘﯩـﺸﻜﻪ ﺋﻮﺧـﺸﺎﭖ
ﻗﺎﻟﯩــﺪﯗ .ﺋﻮﺧــﺸﯩﻤﺎﻳﺪﯨﻐﺎﻥ ﻳﯧــﺮﻯ ،ﺑــﯘ ﺋﯘﺳــﯘﻟﻐﺎ ﻛﻮﺩﻧﯩــﯔ ﺷــﯩﺪﺩﻩﺕ ﺑﯩــﻠﻪﻥ ﻛﯚﭘﯩﻴﯩــﺸﯩﻨﯩﯔ ﺋﺎﻟــﺪﯨﻨﻰ
ﺋﯧﻠﯩﺶ ﺋﯜﭼﯜﻥ ﻳﺎﺧﺸﯩﻠﯩﻨﯩﺶ ﺋﯧﻠﯩﭗ ﺑﯧﺮﯨﻠﻐﺎﻥ .ﻳﻪﻧﻰ ،ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺗﯩﭙﻠﯩﻖ ﭘﺎﺭﺍﻣﯧﺘﯩﺮﻧﻰ ﻛﯚﭘﻤﺎﺱ ﺗﯩﭙﻰ
ﺋﻮﺭﻧﯩــﺪﺍ ﺋﯩــﺸﻠﯩﺘﯩﺪﯨﻐﺎﻥ ﻛﯚﭘﻤــﺎﺱ ﻣﯧﺘــﻮﺩﻻﺭ ﺋﯜﭼــﯜﻥ ﺑﯩــﺮﻻ ﻧﯘﺳــﺨﯩﺪﺍ ILﻛــﻮﺩﻯ ﮬﺎﺳــﯩﻞ ﻗﯩﻠﯩــﭗ
ﻗﻮﻳﯩﺪﯨﻐﺎﻥ ﺋﻪﮬﯟﺍﻝ ﻣﻪﯞﺟﯘﺕ ﺋﯩﺪﻯ.
ﻛﯚﭖ ﻣﺎﺳﻠﯩﻖ ﺋﺎﺭﻗﯩﻠﯩﻖ
int a = 5, b = 10;
int c = (int) Min( a, b );
ﻧﯩﯔ ﺋﻮﺭﻧﯩﻐﺎ
int a = 5, b = 10;
int c = Min<int>( a, b );
ﺩﻩﻙ ﻳﺎﺯﺍﻻﻳﻤﯩﺰ.
ﺋﻪﻣــﺪﻯ ،ﺑــﯘﺭﯗﻥ ﺗﯩــﭗ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺷــﻘﺎ ﺳــﻪﺭﭖ ﻗﯩﻠﯩــﭗ ﻳــﯜﺭﮔﻪﻥ CPUﭼﯩﻘﯩﻤﻠﯩﺮﯨﻤﯩــﺰ ﺗﯧﺠﯩﻠﯩــﭗ،
ﭘﺮﻭﮔﺮﺍﻣﻤﯩﻤﯩــﺰ ﺗﯧﺨﯩﻤــﯘ ﺗﯧــﺰ ﺋﯩﺠــﺮﺍ ﺑﻮﻟﯩــﺪﯨﻐﺎﻥ ﺑﻮﻟﺪﯨــﺪﻩ ....ﭼــﯜﻧﻜﻰ ﺑــﯘﻳﻪﺭﺩﻩ ﮬﯧﭽﻘﺎﻧــﺪﺍﻕ ﺗﯩــﭗ
ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻣﻪﺷﻐﯘﻻﺗﻰ ﻳﯜﺯ ﺑﻪﺭﻣﻪﻳﺪﯗ .ﺋﯘﻧﯩﯔ ﺋﯜﺳﺘﯩﮕﻪ ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤـﺎﻥ ﺑﯧـﺮﯨﻠﮕﻪﻥ ﭘﺎﺭﺍﻣﯧﺘﯩﺮﻧﯩـﯔ
ﻗﯩﻤﻤﯩﺘﯩﮕﻪ ﺋﺎﺳﺎﺳﻪﻥ ﻛﯚﭘﻤﺎﺱ ﺗﯩﭗ Tﻧﯩﯔ ﺋﯧﻨﯩﻖ ﺗﯩﭙﯩﻨﻰ ﭘﻪﺭﻩﺯ ﻗﯩﻼﻻﻳﺪﯗ)ﺗﯩﭗ ﻛﻪﻟﺘﯜﺭﯛﻟﻤﯩـﺴﻰ ﺩﻩﭖ
ﺋﺎﺗﯩﻠﯩﺪﯗ( .ﺷﯘﯕﺎ ﻳﯘﻗﯩﺮﯨﻘﻰ ﻛﻮﺩﻧﻰ ﺗﯧﺨﯩﻤﯘ ﺋﺎﺩﺩﯨﻴﻼﺷﺘﯘﺭﯗﭖ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻛﻤﯘ ﻳﺎﺯﺍﻻﻳﻤﯩﺰ:
int a = 5, b = 10;
int c = Min( a, b );
ﺗﯩﭗ ﻛﻪﻟﺘﯜﺭﯛﻟﻤﯩﺴﻰ :ﺗﯩﭗ ﻛﻪﻟﺘﯜﺭﯛﻟﻤﯩﺴﻰ ﺋﯩﻨﺘﺎﻳﯩﻦ ﻣﯘﮬﯩﻢ ﺋﯩﻘﺘﯩﺪﺍﺭ ﺑﻮﻟﯘﭖ ،ﺋﯘ ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤـﺎﻧﻨﻰ
ﺗﯩﭙﻘﺎ ﺋﺎﻻﻗﯩﺪﺍﺭ ﺗﻪﭘﺴﯩﻠﯩﻲ ﺋﯩﺸﻼﺭﻏﺎ ﺑﯘﻳﺮﯗﭖ ،ﺳﯩﺰﻧﻰ ﺗﯧﺨﯩﻤﯘ ﺋﺎﺑﺴﺘﺮﺍﻛﺖ ﻛﻮﺩ ﻳﯧﺰﯨﺶ ﺋﯩﻤﻜـﺎﻧﯩﻴﯩﺘﯩﮕﻪ
ﺋﯩﮕﻪ ﻗﯩﻠﯩﺪﯗ.
ﻛﯚﭘﻤﺎﺳــﻠﯩﻘﺘﯩﻦ ﭘﺎﻳــﺪﯨﻠﯩﻨﯩﭗ ﻛﯚﭘﻤــﺎﺱ ﻣﯧﺘــﻮﺩ ﺋﯧــﻨﯩﻘﻠﯩﻐﯩﻠﯩﻼ ﺑﻮﻟــﯘﭖ ﻗﺎﻟﻤــﺎﻱ ،ﻳﻪﻧﻪ ﻛﯚﭘﻤــﺎﺱ ﺗــﯜﺭ،
ﺋﯧﻐﯩﺰﻻﺭﻧﯩﻤــﯘ ﺋﯧﻨﯩﻘﻠﯩﻐﯩﻠــﻰ ﺑﻮﻟﯩــﺪﯗ .ﻛﯚﭘﻤﺎﺳــﻠﯩﻖ ﺋﯜﺳــﺘﯩﺪﻩ ﺗــﻮﺧﺘﯩﻠﯩﺶ ﺑــﯘ ﻛﯩﺘﺎﺑﻨﯩــﯔ ﺋﺎﺳﺎﺳــﻠﯩﻖ
ﻣﻪﻗــﺴﯩﺘﻰ ﺑﻮﻟﻤﯩﻐﺎﭼﻘــﺎ ﺗﻪﭘــﺴﯩﻠﯩﻲ ﺗﻮﺧﺘﺎﻟﻤــﺎﻱ .ﻟــﯧﻜﯩﻦ ،ﺷــﯘﻧﻰ ﻳﻪﻧﻪ ﺩﯦﮕﯩــﻢ ﻛﻪﻟــﺪﻯ :ﻛﯚﭘﻤﺎﺳــﻠﯩﻘﻨﻰ
ﭼﯜﺷﻪﻧﻤﻪﻱ ﺗﯘﺭﯗﭖ LINQﻛﯚﺭﺳﯩﯖﯩﺰ ﺋﯚﺯﯨﯖﯩﺰﻧﻰ ﺭﺍﮬﻪﺕ ﮬﯧﺲ ﻗﯩﻼﻟﻤﺎﻳﺴﯩﺰ.
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 13
ﻣﯘﯞﻩﻗﻘﻪﺗﻠﻪﺭ
ﻣﯘﯞﻩﻗﻘﻪﺕ ﺩﯦﮕﯩﻨﯩﻤﯩـﺰ ﺑﯩـﺮ ﻳـﺎﻛﻰ ﺑﯩـﺮﺩﯨﻦ ﺋـﺎﺭﺗﯘﻕ ﻣﯧﺘﻮﺩﻧﯩـﯔ ﻗﺎﭘﻼﻧﻤـﺎ ﺗﯜﺭﯨـﺪﯨﻦ ﺋﯩﺒـﺎﺭﻩﺕ .ﺋﯩﭽﻜـﻰ
ﻗﯩﺴﯩﻤﺪﺍ ،ﺑﯩـﺮ ﺩﺍﻧﻪ ﻣـﯘﯞﻩﻗﻘﻪﺗﺘﻪ ﻣﯘﺷـﯘ ﻣـﯘﯞﻩﻗﻘﻪﺕ ﻗﺎﭘﻠﯩﻐـﺎﻥ ﻣﯧﺘﻮﺩﻻﺭﻏـﺎ ﻗﺎﺭﯨﺘﯩﻠﻐـﺎﻥ ﺋﯩـﺴﺘﯧﺮﯦﻠﻜﯩﻼﺭ
ﺗﯩﺰﻣﯩﺴﻰ ﺳﺎﻗﻠﯩﻨﯩﺪﯗ .ﮬﻪﺭ ﺑﯩﺮ ﺋﯩﺴﺘﺮﯦﻠﻜﺎ ﺋﯚﺯﻯ ﺗﻮﻏﯘﺭﻻﻧﻐﺎﻥ ﻣﯧﺘﻮﺩﻧﻰ ﺋـﯚﺯ ﺋﯩﭽﯩـﮕﻪ ﺋﺎﻟﻐـﺎﻥ ﺗﯜﺭﯨﻨﯩـﯔ
ﭼﺎﻗﯩﺮﯨﻠﻤﯩﺴﯩﻐﺎ ﻣﺎﺱ ﻛﯧﻠﯩﺪﯗ.
ﮬﻪﺭﺑﯩﺮ ﻣﯘﯞﻩﻗﻘﻪﺕ ﺑﯩﺮ-ﻗﺎﻧﭽﻪ ﻣﯧﺘـﻮﺩﻧﻰ ﻗﺎﭘﻠﯩﻴﺎﻻﻳـﺪﯗ .ﻟـﯧﻜﯩﻦ ﺑـﯘ ﭘﺎﺭﺍﮔﺮﺍﻓﺘـﺎ ﭘﻪﻗﻪﺕ ﺑﯩـﺮﻻ ﻣﯧﺘـﻮﺩﻧﻰ
ﻗﺎﭘﯩﻠﯩﻐﺎﻥ ﻣﯘﯞﻩﻗﻘﻪﺗﻠﻪﺭ ﻛﯚﭘﺮﻩﻙ ﻛﯚﯕـﯜﻝ ﺑﯚﻟﯩﻨﯩـﺪﯗ .ﺋﺎﺑـﺴﺘﺮﺍﻛﺘﺮﺍﻕ ﻧﯘﺧﺘﯩـﺪﯨﻦ ﺋﯧﻠﯩـﭗ ﺋﯧﻴﺘـﺴﺎﻕ ،ﺑـﯘ
ﺧﯩﻠــﺪﯨﻜﻰ ﻣــﯘﯞﻩﻗﻘﻪﺗﻠﻪﺭﻧﻰ »ﻛــﻮﺩ ﻗــﺎﭘﭽﯘﻗﻰ« ﻏــﺎ ﺋﻮﺧــﺸﯩﺘﯩﺶ ﻣــﯘﻣﻜﯩﻦ .ﺑــﯘ ﻗــﺎﭘﭽﯘﻗﺘﯩﻜﻰ ﻛــﻮﺩﻧﻰ
ﺋﯚﺯﮔﻪﺭﺗﻜﯩﻠﻰ ﺑﻮﻟﻤﺎﻳﺪﯗ .ﻟﯧﻜﯩﻦ ﺋﯘ ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺩﻩﺳـﺘﯩﻠﯩﺮﯨﮕﻪ ﺋﻪﮔﯩـﺸﯩﭗ ﻳﯚﺗﻜﯩﻠﻪﻟﻪﻳـﺪﯗ ﮬﻪﻣـﺪﻩ ﺗـﺎﻛﻰ
ﺋــﯘﻧﻰ ﺋﯩــﺸﻠﯩﺘﯩﺶ ﺋﯧﮫﺘﯩﻴــﺎﺟﻰ ﻗﺎﻟﻤﯩﻐﺎﻧﻐــﺎ ﻗﻪﺩﻩﺭ ﻣﻪﯞﺟــﯘﺕ ﺑﻮﻟــﯘﭖ ﺗﯘﺭﺍﻻﻳــﺪﯗ .ﺋﯘﻧﯩﯖــﺪﯨﻦ ﺑﺎﺷــﻘﺎ،
ﻣﯘﯞﻩﻗﻘﻪﺕ ﻳﻪﻧﻪ ،ﺋﯚﺯﻯ ﻗﺎﭘﻠﯩﻐـﺎﻥ ﻣﯧﺘـﻮﺩﻧﻰ ﺋـﯚﺯ ﺋﯩﭽﯩـﮕﻪ ﺋﺎﻟﻐـﺎﻥ ﺗـﯜﺭﻧﻰ ﮬـﯧﭻ ﺑﻮﻟﻤﯩﻐﺎﻧـﺪﺍ ﺋﯚﺯﯨﻨﯩـﯔ
ﺋﯚﻣﺮﻯ ﺑﯩﻠﻪﻥ ﺗﻪﯓ ﻳﺎﺷﯩﻐﯘﺯﺍﻻﻳﺪﯗ.
delegate void SimpleDelegate();
delegate int ReturnValueDelegate();
delegate void TwoParamsDelegate( string name, int age );
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ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 14
TwoParamsDelegate c = new TwoParamsDelegate( MethodC );
}
}
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ﺩﺍ ﺋﯩﻨﺘﺎﻳﯩﻦ ﻣﯘﮬﯩﻢ ﺋﻮﺭﯗﻥ ﺗﯘﺗﯩﺪﯗ.
ﻣﻪﯞﺟــﯘﺕ ﻣﯧﺘﻮﺩﻧﯩــﯔ ﺋﯩﭽﯩــﮕﻪ ﮬﻪﺭﻛﻪﺗﭽــﺎﻥ ﮬــﺎﻟﻪﺗﺘﻪ ﻛــﻮﺩ ﻗﯩــﺴﺘﯘﺭﯗﺵ ﺑﻮﻟــﺴﺎ ﻣﯘﯞﻩﻗﻘﻪﺗﻨﯩــﯔ ﺋﻪﯓ
ﺋﻮﻣﯘﻣﻼﺷﻼﺷﻘﺎﻥ ﻗﻮﻟﻠﯩﻨﯩﺸﯩﺪﯗﺭ .ﻛﻮﺩ 2.4ﺩﺍ Repeat10Timesﺑﻮﻟﺴﺎ ﺋﯚﺯﮔﻪﺭﺗﻜﯩﻤﯩﺰ ﻳﻮﻕ ﻣﯧﺘﻮﺩ:
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 15
ﻛﻮﺩ 2.4
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();
}
void Run1() {
Writer writer = new Writer();
writer.Text = "C# chapter";
this.Repeat10Times( writer.Dump );
Console.WriteLine( writer.Counter );
}
// …
}
ﻧﺎﻣﺴﯩﺰ ﻣﯧﺘﻮﺩ
ﺋﺎﻟﺪﯨﻨﻘﻰ ﺑﯚﻟﻪﻛﺘﻪ ،ﻣﯘﯞﻩﻗﻘﻪﺗﻨﯩﯔ ﺩﺍﺋﯩﻤﯩﻠﯩﻖ ﺋﯩﺸﻠﯩﺘﯩﺶ ﺋﯘﺳﯘﻟﻰ ﺋﯜﺳـﺘﯩﺪﻩ ﺗﻮﺧﺘﺎﻟـﺪﯗﻕ C# 2.0 .ﺩﻩ
ﻧﺎﻣﺴﯩﺰ ﻣﯧﺘﻮﺩﻻﺭﻧﻰ ﻗﻮﻟﻠﯩﻨﯩﺶ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻛـﻮﺩ 2.4ﺩﯨﻜﯩـﺪﻩﻙ ﻛـﻮﺩﻻﺭﻧﻰ ﻳﯧﺰﯨـﺸﻨﯩﯔ ﺗﯧﺨﯩﻤـﯘ ﺋـﺎﺩﺩﯨﻲ
ﻳﻮﻟﻠﯩﺮﻯ ﺗﻪﻣﯩﻨﻠﻪﻧﮕﻪﻥ .ﻣﻪﺳﯩﻠﻪﻥ:
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 16
ﻛﻮﺩ 2.5
public class DemoDelegate {
void Repeat10Times( SimpleDelegate someWork ) {
for (int i = 0; i < 10; i++) someWork();
}
void Run2() {
int counter = 0;
this.Repeat10Times( delegate {
Console.WriteLine( "C# chapter" );
counter++;
} );
Console.WriteLine( counter );
}
// …
}
public class DemoDelegate {
void Repeat10Times( TwoParamsDelegate callback ) {
for (int i = 0; i < 10; i++) callback( "Linq book", i
);
}
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 17
void Run3() {
Repeat10Times( delegate( string text, int age ) {
Console.WriteLine( "{0} {1}", text, age );
} );
}
// …
}
Enumeratorsﯞﻩ Yield
C#ﺩﻩ ﭼـــﺎﺭﻻﺵ ﻣﻪﺷـــﻐﯘﻻﺗﯩﻨﻰ ﻗـــﻮﻟﻠﯩﺘﯩﺶ ﺋﯜﭼـــﯜﻥ ﺋﯩﻜﻜـــﻰ ﺩﺍﻧﻪ ﺋﯧﻐﯩـــﺰ ﺗﻪﻣﯩـــﻨﻠﻪﻧﮕﻪﻥ. 1.x
System.Collectionsﻧﺎﻡ ﺑﻮﺷﻠﯩﻘﯩﺪﺍ ﺋﯘﻻﺭﻧﯩﯔ ﺋﯧﻨﯩﻘﻠﯩﻤﯩﺴﻰ ﺑﯧﺮﯨﻠﮕﻪﻥ:
ﻛﻮﺩ 2.7
public interface IEnumerator {
bool MoveNext();
object Current { get; }
void Reset();
}
public interface IEnumerable {
IEnumerator GetEnumerator();
}
ﻛـــﻮﺩ 2.8ﺩﻩ ﻳـــﯘﻗﯩﺮﯨﻘﻰ ﺋﯘﺳـــﯘﻝ ﺋـــﺎﺭﻗﯩﻠﯩﻖ ﭼـــﺎﺭﻟﯩﻐﯩﻠﻰ ﺑﻮﻟﯩـــﺪﯨﻐﺎﻥ ﺗـــﯜﺭ ﺋﯧﻨﯩﻘﻼﻧـــﺪﻯ .ﻛـــﯚﺭﯛﭖ
ﺗﯘﺭﻏﯩﻨﯩﯖﯩﺰﺩﻩﻙ CountdownEnumerator ،ﺗﯜﺭﻯ ﺋﯩﻨﺘﺎﻳﯩﻦ ﻣﯘﺭﻩﻛﻜﻪﭖ .ﺋﯘﻧﯩﯖـﺪﺍ ،ﭼﺎﺭﻟﯩﻐﯘﭼﯩﻨﯩـﯔ
ﻗﺎﻳﺘﯘﺭﯨــــﺪﯨﻐﯩﻨﻰ ﺑﺎﺷــــﻘﺎ ﻧﻪﺭﺳــــﻪ ﺋﻪﻣﻪﺱ ﺑﻪﻟﻜــــﻰ Countdownﺗﯜﺭﯨــــﺪﻩ ﺋﯧﻨﯩﻘﻼﻧﻐــــﺎﻥ ﻣﯩﻘــــﺪﺍﺭ
StartCountdownﺩﯨﻦ ﺑﺎﺷﻠﯩﻨﯩﭗ ﺑﯩﺮﺩﯨﻦ ﻛﯧﻤﯩﻴﯩﭗ ﺑﺎﺭﯨﺪﯨﻐﺎﻥ ﻗﯩﻤﻤﻪﺗﺪﯗﺭ.
ﻛﻮﺩ 2.8
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;
}
}
}
public class DemoEnumerator {
public static void DemoCountdown() {
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 19
Countdown countdown = new Countdown();
countdown.StartCountdown = 5;
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 );
}
}
// …
}
public class DemoEnumeration {
public static void DemoCountdownForeach() {
Countdown countdown = new Countdown();
countdown.StartCountdown = 5;
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 20
foreach (int n in countdown) {
Console.WriteLine( n );
}
foreach (int n in countdown) {
Console.WriteLine( "{0} BIS", n );
}
}
// …
}
public class CountdownYield : IEnumerable {
public int StartCountdown;
public IEnumerator GetEnumerator() {
for (int i = StartCountdown ‐ 1; i >= 0; i‐‐) {
yield return i;
}
}
}
ﻟﻮﮔﯩﻜﺎ ﻧﯘﺧﺘﯩﺴﯩﺪﯨﻦ ﺋﯧﻠﯩﭗ ﺋﯧﻴﺘﻘﺎﻧﺪﺍ yield return ،ﺟﯜﻣﻠﯩﺴﻰ ﺋﯩﺠـﺮﺍ ﻣﻪﺷـﻐﯘﻻﺗﯩﻨﻰ ﯞﺍﻗﯩﺘﻠﯩـﻖ
ﺗﻮﺧﺘﯩﺘﯩــﭗ ﻗﻮﻳــﯘﺵ ﺑﯩــﻠﻪﻥ ﺑــﺎﺭﺍﯞﻩﺭ ﺑﻮﻟــﯘﭖ MoveNext ،ﻛﯧﻴﯩﻨﻜــﻰ ﻗﯧــﺘﯩﻢ ﭼﺎﻗﯩﺮﯨﻠﻐﺎﻧــﺪﺍ ﺋﺎﻧــﺪﯨﻦ
ﺩﺍﯞﺍﻣﻠﯩــﺸﯩﺪﯗ .ﺷﯘﻧﯩــﺴﻰ ﺋﯧــﺴﯩﯖﯩﺰﺩﻩ ﺑﻮﻟــﺴﯘﻥ ،ﭘﯜﺗﻜــﯜﻝ ﭼــﺎﺭﻻﺵ ﺟﻪﺭﻳﺎﻧﯩــﺪﺍ GetEnumerator
ﻣﯧﺘﻮﺩﻯ ﭘﻪﻗﻪﺕ ﺑﯩﺮﻻ ﻗﯧﺘﯩﻢ ﭼﺎﻗﯩﺮﯨﻠﯩﭗ IEnumeratorﺋﯧﻐﯩﺰﯨﻨﻰ ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﺎﻥ ﺗﯜﺭ ﻗـﺎﻳﺘﯘﺭﯗﭖ
ﺑﯧﺮﯨــﺪﯗ .ﭘﻪﻗﻪﺕ ﻣﯘﺷــﯘ ﺗــﯜﺭﻻ yieldﺟﯜﻣﻠﯩــﺴﯩﻨﻰ ﺋــﯚﺯ ﺋﯩﭽﯩــﮕﻪ ﺋﺎﻟﻐــﺎﻥ ﻣﯧﺘــﻮﺩ ﺧــﯘﻟﻘﯩﻨﻰ ﮬﻪﻗﯩﻘﯩــﻲ
ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﺎﻥ ﺑﻮﻟﯩﺪﯗ.
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 21
public class CountdownYieldMultiple : IEnumerable {
public IEnumerator GetEnumerator() {
yield return 4;
yield return 3;
yield return 2;
yield return 1;
yield return 0;
}
}
public class CountdownYieldTypeSafe : IEnumerable<int> {
public int StartCountdown;
IEnumerator IEnumerable.GetEnumerator() {
return this.GetEnumerator();
}
public IEnumerator<int> GetEnumerator() {
for (int i = StartCountdown ‐ 1; i >= 0; i‐‐) {
yield return i;
}
}
}
C# 3.0ﻧﯩﯔ ﺧﯘﺳﯘﺳﯩﻴﻪﺗﻠﯩﺮﻯ
varﺧﺎﺱ ﺳﯚﺯﻯ
ﻳﯧﯖﯩــﺪﯨﻦ ﻗﻮﺷــﯘﻟﻐﺎﻥ varﺧــﺎﺱ ﺳــﯚﺯﻯ ﺋــﺎﺭﻗﯩﻠﯩﻖ ،ﺗﯩﭙــﻰ ﺋﯧﻨﯩــﻖ ﺑﻮﻟﻤﯩﻐــﺎﻥ ﺋﯚﺯﮔﻪﺭﮔــﯜﭼﻰ ﻣﯩﻘ ـﺪﺍﺭ
.NET ﺋﯧﻨﯩﻘﻼﺷــﻘﺎ ﺑﻮﻟﯩــﺪﯗ var .ﺑﯩــﻠﻪﻥ ﺑﺎﺷــﻘﺎ »ﺋﯧﻨﯩــﻖ ﺗﯩــﭙﻼﺭ« ﺋﺎﺭﯨــﺴﯩﺪﯨﻜﻰ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺷــﻨﻰ
ﻗﯘﺭﯗﻟﻤﯩــﺴﻰ ﺋﺎﭘﺘﻮﻣﺎﺗﯩــﻚ ﺑﯧﺠﯩﺮﻩﻟﻪﻳــﺪﯗ .ﺷــﯘﻧﻰ ﺋﻪﺳــﻜﻪﺭﺗﯩﺶ ﺯﯙﺭﯛﺭﻛــﻰ var ،ﺋــﺎﺭﻗﯩﻠﯩﻖ ﺋﯧــﻨﯩﻘﻼﺵ
objectﺋﺎﺭﻗﯩﻠﯩﻖ ﺋﯧﻨﯩﻘﻼﺷﻘﺎ ﺑﺎﺭﺍﯞﻩﺭ ﺋﻪﻣﻪﺱ .ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻣﯩﺴﺎﻝ ﺑﯘﻧﯩﯖﻐﺎ ﺋﯩﺴﭙﺎﺕ ﺑﻮﻻﻻﻳﺪﯗ:
;var a = 2 ﭘﯜﺗﯜﻥ ﺳﺎﻥ ﺗﯩﭙﻠﯩﻖ ﻗﯩﻠﯩﭗ ﺋﯧﻨﯩﻘﻼﻧﺪﻯ //
;object b = 2 ﻗﯩﻤﻤﻪﺗﻠﯩﻚ ﺗﯩﭗ ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺗﯩﭙﻘﺎ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﻟﺪﻯ ،ﺳﻪﺭﭘﯩﻴﺎﺗﻰ ﻳﯘﻗﯩﺮﻯ //
;int c = a ﮬﯩﭻ ﻗﺎﻧﺪﺍﻕ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻳﯜﺯ ﺑﻪﺭﻣﻪﻳﺪﯗ ،ﺗﯧﺰ //
ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺗﯩﭗ ﻗﯩﻤﻤﻪﺗﻠﯩﻚ ﺗﯩﭙﻘـﺎ ﻣﻪﺟﺒـﯘﺭﻯ ﺋﺎﻟﻤﺎﺷـﯘﺗﯘﺭﯗﻟﯩﺪﯗ ،ﺳـﻪﺭﭘﯩﻴﺎﺕ int d = (int) b; //
ﻳﯘﻗﯩﺮﻯ
int a = 5;
int b = a;
C#ﺗﯩﻠﯩـــﺪﺍ ﺗﯩﭙﻼﺭﻧﯩـــﯔ ﺗـــﯜﺭﻟﯩﺮﻯ ﺷـــﯘﻧﭽﯩﻠﯩﻚ ﺗﻮﻟـــﯘﻕ ﺗﯘﺭﯗﻗﻠـــﯘﻕ ﻳﻪﻧﻪ ﻧﯧﻤﯩـــﺸﻘﺎ ﭘﺮﻭﮔﺮﺍﻣﻤﯩﻨﯩـــﯔ
ﻗﺎﺭﯨﻤﺎﻗﻘــﺎ varﮬــﻮﺭﯗﻥ ﺋﻮﻗﯘﺷــﭽﺎﻧﻠﯩﻘﯩﻨﻰ ﺗﯚﯞﻩﻧﻠﯩﺘﯩﯟﯦﺘﯩــﺪﯨﻐﺎﻥ varﺧــﺎﺱ ﺳــﯚﺯﯨﻨﻰ ﺋﯩــﺸﻠﯩﺘﯩﻤﯩﺰ؟
ﭘﺮﻭﮔﺮﺍﻣﻤﯩﻼﺭﻧﯩــﯔ ﺋﯧﮫﺘﯩﻴــﺎﺟﻰ ﺋﯜﭼــﯜﻥ ﻻﻳﮫﯩﻴﻪﻟﻪﻧﮕﻪﻧــﺪﻩﻙ ﺗﯘﺭﺳــﯩﻤﯘ ،ﺋﻪﻣﻪﻟﯩﻴﻪﺗــﺘﻪ ﺋــﯘ »ﻧﺎﻣــﺴﯩﺰ
ﺋﯚﺯﮔﻪﺭﮔﯜﭼﻰ ﻣﯩﻘﺪﺍﺭ«)ﻛﯧﻴﯩﻦ ﺳﯚﺯﻟﯩﻨﯩﺪﯗ( ﺋﯧﻨﯩﻘﻼﺷﻨﯩﯔ ﺑﯩﺮﺩﯨﻦ -ﺑﯩﺮ ﻳﻮﻟﻰ.
ﺑــﯘ ﻳﻪﺭﺩﯨﻜــﻰ varﺗﯩــﭗ -ﺑﯩﺨﻪﺗﻪﺭﻟﯧﻜﯩﻨ ـﻰ ﺋﻪﻣﻪﻟــﮕﻪ ﺋﺎﺷــﯘﺭﻏﺎﻧﻠﯩﻘﻰ ﺋﯜﭼــﯜﻥ Vsiaul Basicﺩﯨﻜــﻰ
varﺧﺎﺱ ﺳﯚﺯﯨﺪﯨﻦ ﭘﻪﺭﻗﻠﯩﻨﯩﺪﯗ)ﻛﯚﭖ ﻛﯜﭼﻠﯜﻙ(.
Varﺗﯩﭙﯩﻨﻰ ﭘﻪﻗﻪﺕ ﻳﻪﺭﻟﯩﻚ ﺋﻮﺭﯗﻧﺪﯨﻼ ﺋﯩﺸﻠﯩﺘﯩﺸﻜﻪ ﺑﻮﻟﯩﺪﯗ .ﺋﯘﻧﻰ ﺗﯜﺭﻧﯩﯔ ﻣﯧﺘﻮﺩﻻﺭﻧﯩﯔ ﭘـﺎﺭﺍﻣﯧﺘﯩﺮﻯ
ﻳﺎﻛﻰ ﻗﺎﻳﺘﯘﺭﻣﺎ ﻗﯩﻤﻤﯩﺘﯩﻨﯩﯔ ﺗﯩﭙﻰ ﺋﻮﺭﻧﯩﺪﺍ ﺋﯩﺸﻠﯩﺘﯩﺸﻜﻪ ﺑﻮﻟﻤﺎﻳﺪﯗ.
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ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 23
var p = default(string); // string
}
class VarDemo {
ﺗﯜﺭ ﻳﺎﻛﻰ ﺋﯧﻐﯩﺰﻻﺭﻧﯩﯔ ﺧﺎﺳﻠﯩﻘﻰ ﺳﯜﭘﯩﺘﯩﺪﻩ ﺋﯩﺸﻠﯩﺘﯩﺸﻜﻪ ﺑﻮﻟﻤﺎﻳﺪﯗ //
var k =0;
ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪ ﻣﯧﺘﻮﺩ
C#ﺑﻮﻟﺴﺎ ﺋﻮﺑﯩﻜﺘﯩﭙﻘﺎ ﻳﯜﺯﻟﻪﻧﮕﻪﻥ ﺗﯩﻞ ﺑﻮﻟﯘﭖ ،ﺋﺎﺗﺎ ﺗـﯜﺭﮔﻪ ﺑـﺎﻻ ﺗـﯜﺭﻧﻰ ﯞﺍﺭﯨـﺴﻠﯩﻖ ﻗﯩﻠـﺪﯗﺭﯗﭖ ﻳﯧﯖـﻰ
ﻣﯧﺘﻮﺩﻻﺭﻧﻰ ﻗﻮﺷﯘﺵ ﻳﺎﻛﻰ ﺋﻪﺳﻠﻰ ﺑﺎﺭ ﺑﻮﻟﻐـﺎﻥ ﻣﯧﺘـﻮﺩﻻﺭﻧﻰ ﻗﺎﻳﺘـﺎ ﻳـﯧﯖﯩﻼﺵ ﺋـﺎﺭﻗﯩﻠﯩﻖ ﺋﺎﺗـﺎ ﺗﯜﺭﻧﯩـﯔ
ﺋﯩﻘﺘﯩــﺪﺍﺭﯨﻨﻰ ﺋﺎﺷــﯘﺭﯗﺵ ﻣﻪﻗــﺴﯩﺘﯩﮕﻪ ﻳﻪﺗﻜﯩﻠــﻰ ﺑﻮﻟﯩــﺪﯗ .ﺑﯩــﺮﺍﻕ »ﺑﯩﺨﻪﺗﻪﺭﻟﯩــﻚ« ﺑﯩــﻠﻪﻥ »ﺟــﺎﻧﻠﯩﻖ
ﺋﯩــﺸﻠﯩﺘﯩﺶ« ﺑــﯘ ﺧﯩــﻞ ﻣﻪﺳــﯩﻠﯩﻠﻪﺭﻧﻰ ﮬﻪﻝ ﻗﯩﻠﯩــﺸﺘﯩﻜﻰ ﺋﯩﻜﻜــﻰ ﻗــﺎﺭﻣﯘ-ﻗﺎﺭﺷــﻰ ﺋﺎﻣﯩــﻞ ﺑﻮﻟــﯘﭖ
ﻛﯧﻠﯩﯟﺍﺗﯩﺪﯗ.
C#3.0ﺩﻩ ﻧﯚﯞﻩﺗﺘﻪ ﺑﺎﺭ ﺑﻮﻟﻐﺎﻥ ) .Netﻧﯩﯔ ﺋﯚﺯﯨﺪﻩ ﺑﺎﺭ ﺑﻮﻟﻐﺎﻧﻠﯩﺮﯨﻤﯘ ﺷﯘ( ﺗﯜﺭ )ﺗﯩﭙﻼﺭﻣـﯘ ﺷـﯘ( ﻻﺭﻏـﺎ
ﻳﯧﯖﻰ ﺗﯜﺭﻧﻰ ﯞﺍﺭﯨﺴﻠﯩﻖ ﻗﯩﻠﺪﯗﺭﻣﺎﻱ ﺗﯘﺭﯗﭖ ﻳﯧﯖﻰ ﺋﯩﻘﺘﯩﺪﺍﺭ ﻗﻮﺷﯘﺷﻘﺎ ﻳﻮﻝ ﻗﻮﻳﯘﻟﻐﺎﻥ ﯞﻩ ﻣﯘﻧﺎﺳـﯩﯟﻩﺗﻠﯩﻚ
ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﯗﺵ ﻗﺎﺋﯩﺪﯨﻠﯩﺮﻯ ﺑﻪﻟﮕﯩﻠﻪﻧﮕﻪﻥ .ﻣﻪﺳﯩﻠﻪﻥ ﭘﯜﺗﯜﻥ ﺳﺎﻥ ﺗﯩﭙﻰ intﻧﻰ ﻣﯩﺴﺎﻟﻐﺎ ﺋﺎﻟﺴﺎﻕ:
ﻛﻮﺩ 4
int i =5;
Int j = i+1; //j == 6
int t = i‐1; //t == 4
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 24
ﺑﯘ ﺋﯜﭺ ﻗﯘﺭ ﭘﺮﻭﮔﺮﺍﻣﻤﺎ ﮬﻪﻣﻤﯩﻤﯩﺰﮔﻪ ﭼﯜﺷﯜﻧﯜﺷﻠﯜﻙ .ﻳﯘﻗﯩﺮﯨﻘﻰ ﺟﯜﻣﻠﯩﻠﻪﺭﻧﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻳﻮﻝ ﺋـﺎﺭﻗﯩﻠﯩﻖ
ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﯩﻠﻰ ﺑﻮﻻﻣﺪﯗ ﺩﻩﭖ ﭘﻪﺭﻩﺯ ﻗﯩﻠﯩﭗ ﺑﺎﻗﺎﻳﻠﻰ:
ﻛﻮﺩ 5
int i =5;
Int j = i.Increase(); // j == 6
int t = i.Decrease(); // t == 4
ﺑﯘﻧﯩﯔ ﺋﯜﭼﯜﻥ intﺗﯩﭙﯩﻨﯩﯔ ﭼﻮﻗﯘﻡ ﺋﯚﺯ ﻗﯩﻤﻤﯩﺘﯩﻨﻰ ﺑﯩﺮ ﺋﺎﺷﯘﺭﯗﭖ ﻳﺎﻛﻰ ﺑﯩﺮ ﺗﯚﯞﻩﻧﻠﯩﺘﯩـﭗ ﻗـﺎﻳﺘﯘﺭﯗﭖ
ﺑﯧﺮﻩﻟﻪﻳــﺪﯨﻐﺎﻥ )(Increaseﯞﻩ )( Decreaseﻧــﺎﻣﻠﯩﻖ )ﻳــﺎﻛﻰ ﺑﺎﺷــﻘﺎ ﻧــﺎﻣﻠﯩﻖ( ﻣﯧﺘــﻮﺩﻟﯩﺮﻯ ﺑﻮﻟﯘﺷــﻰ
ﻛﯧــــﺮﻩﻙ .ﻟــــﯧﻜﯩﻦ ﺋﻪﺳــــﻠﻰ ﻗﯘﺭﯗﻟﻤﯩــــﺪﺍ intﻧﯩــــﯔ ﺑــــﯘ ﺋﯩﻘﺘﯩــــﺪﺍﺭﻟﯩﺮﻯ ﺗﻪﻣﯩــــﻨﻠﻪﻧﻤﯩﮕﻪﻥ .ﺑﯩــــﺰ
ﺩﻩﯞﻩﺗﻘــﺎﻥ»ﻛﯧﯖﻪﻳــﺘﯩﻠﮕﻪﻥ ﻣﯧﺘــﻮﺩ« ﺋﯩﻘﺘﯩــﺪﺍﺭﻯ ﺩﻩﻝ ﻣﯘﺷــﯘﻧﯩﯖﺪﻩﻙ ﻣﻪﺳــﯩﻠﯩﻠﻪﺭﮔﻪ ﺗﺎﻗﺎﺑﯩــﻞ ﺗــﯘﺭﯗﺵ
ﻣﻪﻗﺴﯩﺘﯩﺪﻩ ﻗﻮﺷﯘﻟﻐﺎﻥ.
ﺋﻪﻣﺪﻯ ﺑﯩﺰ intﻧﻰ ﻛﯧﯖﻪﻳﺘﯩﭗ ﺑﺎﻗﺎﻳﻠﻰ .ﻧـﯚﯞﻩﺗﺘﯩﻜﻰ ﺗـﯜﺭﯨﻤﯩﺰﮔﻪ) (projectﻳﯧﯖﯩـﺪﯨﻦ ﺗـﯜﺭ ﻗﻮﺷـﯘﭖ
ﺋﯘﻧﯩــﯔ ﺋﯩــﺴﯩﻤﯩﻨﻰ IntegerExtensionﺩﻩﭖ ﻗﻮﻳــﺎﻳﻠﻰ).ﺧﺎﻟﯩﻐــﺎﻧﭽﻪ ﻗﻮﻳــﺴﯩﯖﯩﺰ ﺑﻮﻟﯩــﺪﯗ( .ﺋﯘﻧﯩــﯔ
ﻣﻪﺯﻣﯘﻧﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﺑﻮﻟﺴﯘﻥ:
ﻛﻮﺩ 6
namespace ConsoleApplication5
{
static class IntegerExtension
{
public static int Increase(this int i)
{
return i + 1;
}
public static int Decrease(this int i)
{
return i ‐ 1;
}
}
ﻳﯘﻗﯩﺮﯨﻘﻰ ﻗﯘﺭﯗﻟﻤﯩﺪﯨﻜﻰ ﺋﺎﺳﺘﯩﻐﺎ ﻗﯩﺰﯨﻞ ﺳﯩﺰﯨﻖ ﺳﯩﺰﯨﻠﻐﺎﻧﻠﯩﺮﯨﻨﻰ ﺋﯚﺯ ﭘﯧﺘﻰ ﻳﯧﺰﯨﺸﯩﯖﯩﺰ ﻛﯧﺮﻩﻙ .ﻳﯧﺸﯩﻞ
ﺳﯩﺰﯨﻖ ﺳﯩﺰﯨﻠﻐﺎﻧﻠﯩﺮﻯ ﺑﻮﻟﺴﺎ ﺋﯧﮫﺘﯩﻴﺎﺟﻐﺎ ﻗﺎﺭﺍﭖ ﺋﯚﺯﮔﯜﺭﯨﺪﯗ .ﺩﯦﻤﻪﻙ:
ﻛﯧﯖﻪﻳـــﺘﯩﺶ ﻣﯧﺘـــﻮﺩﻯ ﯞﻩ ﺋـــﯘﻧﻰ ﺋـــﯚﺯ ﺋﯩﭽﯩـــﮕﻪ ﺋﺎﻟﻐـــﺎﻥ ﺗـــﯜﺭ ﭼﻮﻗـــﯘﻡ ﺗﯘﺭﺍﻗﻠﯩـــﻖ ﺑﻮﻟﯘﺷـــﻰ z
ﻛﯧﺮﻩﻙ).(static
ﻛﯧﯖﻪﻳـــﺘﯩﺶ ﻣﯧﺘﻮﺩﯨﻨﯩـــﯔ ﭘـــﺎﺭﺍﻣﯧﺘﯩﺮﻯ ﺋﺎﻟـــﺪﯨﻐﺎ thisﺧـــﺎﺱ ﺳـــﯚﺯﯨﻨﻰ ﻗﻮﺷـــﯘﺵ ﺋـــﺎﺭﻗﯩﻠﯩﻖ z
ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪﻛﭽﻰ ﺑﻮﻟﻐـﺎﻥ ﺗﯩﭙﻨـﻰ ﺑﻪﻟﮕﯩﻠﯩـﺸﯩﻤﯩﺰ ﻛﯧـﺮﻩﻙ .ﻣﻪﺳـﯩﻠﻪﻥ :ﻳﯘﻗـﺎﺭﻗﻰ ﻣﯩـﺴﺎﻟﺪﺍ intﺗﯩﭙﯩﻨـﻰ
ﻛﯧﯖﻪﻳﺘﯩﺪﯗ.
ﻛﯧﯖﻪﻳﺘﯩﺶ ﻣﯧﺘﻮﺩﯨﻨﯩﯔ ﻗﺎﻳﺘﯘﺭﻣﺎ ﻗﯩﻤﻤﻪﺕ ﺗﯩﭙﻰ ﺧﺎﻟﯩﻐﺎﻧﭽﻪ ﺑﻮﻟﺴﺎ ﺑﻮﻟﯩﺪﯗ .ﻣﻪﺳﯩﻠﻪﻥ: z
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 26
ﻛﻮﺩ 7
public static float Devide(this int i)
{
return (float)i / 2;
}
ﺑﯘ ﻣﯧﺘﻮﺩ intﺗﯩﭙﯩﻐﺎ ﺋﯚﺯ ﻗﯩﻤﻤﯩﺘﯩﻨﯩﯔ ﻳﯧﺮﯨﻤﻰ ﻗﺎﻳﺘﯘﺭﯗﺵ ﺋﯩﻘﺘﯩـﺪﺍﺭﯨﻨﻰ ﻗﻮﺷـﯩﺪﯗ .ﺋﻪﻟـﯟﻩﺗﺘﻪ ،ﭘﯜﺗـﯜﻥ
ﺳﺎﻧﻨﻰ ﺋﯩﻜﻜﯩﮕﻪ ﺑﯚﻟﺴﻪﻙ ﻛﻪﺳﯩﺮ ﺳﺎﻧﻤﯘ ﭼﯩﻘﯩﺪﯗ .ﺷﯘﯕﺎ ﻗﺎﻳﻤﺎ ﻗﯩﻤﻤﻪﺕ ﺗﯩﭙﯩﻨﻰ floatﻗﯩﻠﺪﯗﻕ.
ﺑﯩﺮﺩﺍﻧﻪ ﻛﯧﯖﻪﻳﺘﯩﺶ ﺗﯜﺭﻯ ﺋﯩﭽﯩﮕﻪ ﺑﯩﺮﻗﺎﻧﭽﻪ ﺗﯩﭙﻨﯩﯔ ﻛﯧﯖﻪﻳﺘﯩﺶ ﻣﯧﺘﻮﺩﻟﯩﺮﯨﻨﻰ ﺋﺎﺭﻻﺵ ﻳـﺎﺯﻏﯩﻠﻰ z
ﺑﻮﻟﯩﺪﯗ .ﻣﻪﺳﯩﻠﻪﻥ:
ﻛﻮﺩ 8
static class MixedExtension
{
public static int Increase(this int i)
{
return i + 1;
}
public static float DoubleIt(this float f)
{
return f * f;
}
}
)( DoubleItﺑﯩــﺮ ﺗــﯜﺭ ﺋﯩﭽﯩــﮕﻪ ﻳﯧﺰﯨﻠــﺪﻯ .ﻛﯧﻴﯩﻨﻜﯩــﺴﻰ ﺑﻮﻟــﺴﺎ floatﺗﯩﭙﯩﻐــﺎ ﺋــﯚﺯ ﻗﯩﻤﻤﯩﺘﯩﻨﯩــﯔ
ﻛﯘﯞﺍﺩﯨﺮﺍﺗﯩﻨﻰ ﻗﺎﻳﺘﯘﺭﯗﺵ ﺋﯩﻘﺘﯩﺪﺍﺭﯨﻨﻰ ﻗﻮﺷﯩﺪﯗ.
int i = 5;
int j = i.Increase().Increase().Increase(); //j==8
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 27
ﺋﻪﮔﻪﺭ ﺋﺎﺷﯘﺭﻣﺎﻗﭽﻰ ﺑﻮﻟﻐـﺎﻥ ﻗﯩﻤﻤﻪﺗﻨـﻰ ﭘﺎﺗـﺎﻣﯧﺘﯩﺮ ﺋـﺎﺭﻗﯩﻠﯩﻖ ﻳـﻮﻟﻼﭖ ﺑﻪﺭﺳـﻪﻛﭽﯘ؟ ﺋﻪﻟـﯟﻩﺗﺘﻪ ﺑﻮﻟﯩـﺪﯗ.
ﺑﯘﻧﯩﯔ ﺋﯜﭼﯜﻥ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻛﻮﺩ ﻳﺎﺯﯨﻤﯩﺰ:
ﻛﻮﺩ 10
public static int Increase(this int i, int degree)
{
return i + degree;
}
ﺑﯩﺮﯨﻨﭽﻰ ﭘﺎﺭﺍﻣﺘﯧﺮﻯ »ﻣﯘﺷﯘ ﺗﯩﭙﻠﯩﻖ ﺋﯚﺯﯛﻡ« ﺩﯦﮕﻪﻥ ﻣﻪﻧﯩﺪﻩ ،ﺋﯩﻜﻜﻰ ﭘﺎﺭﺍﻣﯧﺘﯩﺮ ﺑﯩﺮ ﺩﺍﻧﻪ ﭘﯜﺗﯜﻥ ﺳﺎﻥ
ﺗﯩﭙﻠﯩﻖ )ﺑﯘ ﻳﻪﺭﺩﯨﻜﻰ ﭘﺎﺗﺎﻣﯧﺘﯩﺮ ﺗﯩﭙﯩﻐﺎ ﭼﻪﻙ ﻳﻮﻕ( ﻗﯩﻤﻤﻪﺕ .ﻗﺎﻳﺘﯘﺭﻣﺎ ﻗﯩﻤﻤﻪﺕ ﺋﻪﺳﻠﻰ ﻗﯩﻤﻤﻪﺕ ﺑﯩﻠﻪﻥ
ﺋﯩﻜﻜﯩﭽﻰ ﭘﺎﺗﺎﻣﯧﺘﯩﺮﺩﺍ ﺑﯧﺮﯨﻠﮕﻪﻥ ﻗﯩﻤﻤﻪﺗﻨﯩﯔ ﻳﯩﻐﯩﻨﺪﯨﺴﻰ .ﺋﻪﻣﺪﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻛﻮﺩ ﻳﺎﺯﺍﻻﻳﻤﯩﺰ.
ﻛﻮﺩ 11
int i = 5;
int j = i.Increase(3); //j == 5+3 == 8
ﻳﻪﻧﻪ ﻣﻪﺳﯩﻠﻪﻥ:
ﻛﻮﺩ 12
static class MixedExtension
{
public static string ExtendedTrim(this string s, char c)
{
return s.Trim(new char[] { c });
}
}
ﻣﯘﻧﺎﺳﯩﭗ ﺋﯩﺸﻠﯩﺘﯩﺶ:
ﻛﻮﺩ 13
public class A {
public virtual void X() {}
}
public class B : A {
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 28
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();
public string Country;
public Customer( string name, int age ) {
this.Name = name;
this.Age = age;
}
// …
}
ﺩﯦـﻤﻪﻙ ﺋـﯘ ) new Customer( "Tom", 32 ﺩﻩﻙ ﺋﯩﺸﻠﯩﺘﯩـﺸﻜﻪ ﻣﯘﻧﺎﺳـﯩﭗ ﻗﯘﺭﻏـﯘﭼﻰ ﻣﯧﺘـﻮﺩﻧﻰ
ﺗﻪﻳﻴﺎﺭﻟﯩﺸﻰ ﻛﯧﺮﻩﻙ .ﺑﯩﺮﺍﻕ ﺑﯘ ﻗﯘﺭﻏﯘﭼﯩﻨﯩﯔ ﺑﯩﺮ ﺋﺎﺟﯩﺰﻟﯩﻘﻰ ﺑﺎﺭ ﻳﻪﻧﻰ :ﻗﯘﺭﻏﺎﻥ ﭘﻪﻳﺘﺘﻪ nameﺑﯩﻠﻪﻥ
ageﻧـﻰ ﭼﻮﻗـﯘﻡ ﻳـﻮﻟﻼﭖ ﺑﯧﺮﯨـﺸﯩﻤﯩﺰ ﻛﯧـﺮﻩﻙ .ﺋﻪﮔﻪﺭ Countryﺑﯩـﻠﻪﻥ nameﻻ ﺑﻮﻟﻐـﺎﻥ age ،ﺋـﻰ
ﻗﯘﺭﯗﻕ ﺑﻮﻟﻐﯩﻨﯩﻨﻰ ﻗﯘﺭﯗﺵ ﺋﯜﭼﯜﻥ ﻳﺎﻛﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻛـﻮﺩ ﻳﯧـﺰﯨﺶ ،ﻳـﺎﻛﻰ ﻣﯘﻧﺎﺳـﯩﭗ ﻗﯘﺭﻏـﯘﭼﻰ
ﻣﯧﺘﻮﺩﯨﻨﻰ ﺗﻪﻣﯩﻨﻠﻪﺵ ﻛﯧﺮﻩﻙ.
ﻛﻮﺩ 2.27
Customer customer = new Customer();
customer.Name = "Marco";
customer.Country = "Italy";
ﺋﻮﺑﻴﯧﻜﯩﺘﻨﻰ ﺩﻩﺳﻠﻪﭘﻠﻪﺷﺘﯜﺭﯛﺷﺘﯩﻦ ﺋﺎﯞﺍﻝ ﺗﯜﺭﻧﯩﯔ ﻛﯚﯕﯜﻟﺪﯨﻜﻰ ﻗﯘﺭﻏﯘﭼﻰ ﻣﯧﺘﻮﺩﯨﻨﻰ ﻳﻮﺷﯘﺭﯗﻥ ﮬﺎﻟﺪﺍ ﭼﺎﻗﯩﺮﯨﺪﯗ //
Customer customer = new Customer { Name = "Marco", Country =
"Italy" };
ﺋﻮﺑﻴﯧﻜﯩﺘﻨﻰ ﺩﻩﺳﻠﻪﭘﻠﻪﺷﺘﯜﺭﯛﺷﺘﯩﻦ ﺋﺎﯞﺍﻝ ﺗﯜﺭﻧﯩﯔ ﻛﯚﯕﯜﻟﺪﯨﻜﻰ ﻗﯘﺭﻏﯘﭼﻰ ﻣﯧﺘﻮﺩﯨﻨﻰ ﺋﺎﺷﻜﺎﺭﻩ ﮬﺎﻟﺪﺍ ﭼﺎﻗﯩﺮﯨﺪﯗ //
Customer customer = new Customer() { Name = "Marco", Country =
"Italy" };
ﻟﯧﻜﯩﻦ ﺋﺎﻟﺪﯨﻨﻘﻰ ﺷﻪﺭﺕ ﺷﯘﻛﻰ ﺗﯩﺮﻧﺎﻕ ﺋﯩﭽﯩﺪﯨﻜﻰ ﺧﺎﺳﻠﯩﻘﻼﺭ ﭼﻮﻗﯘﻡ publicﺑﻮﻟﯘﺷﻰ ﻛﯧﺮﻩﻙ.
ﺋﻪﮔﻪﺭ ﺗﯜﺭ ﻣﻪﻟـﯘﻡ ﭘﺎﺗـﺎﻣﯧﺘﯩﺮﻟﯩﻖ ﻗﯘﺭﻏـﯘﭼﻰ ﻣﯧﺘـﻮﺩﻻﺭﻧﻰ ﺗﻪﻣﯩـﻨﻠﯩﮕﻪﻥ ﺑﻮﻟـﺴﺎ ،ﻳـﯘﻗﯩﺮﯨﻘﻰ ﺟـﯜﻣﻠﯩﻠﻪﺭﻧﻰ
ﻗﯘﺭﻏﯘﭼﻰ ﻣﯧﺘﻮﺩﻯ ﺋﺎﺳﺎﺳﯩﺪﺍ ﻳﺎﺯﻏﯩﻠﻰ ﺑﻮﻟﯩﺪﯗ .ﻣﻪﺳﯩﻠﻪﻥ:
ﻛﻮﺩ 2.29
Customer c2 = new Customer( "Paolo", 21 ) { Country = "Italy" };
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; } }
}
ﻗــﺎﻧﭽﻪ ﻗــﯘﺭ ﺋــﺎﺭﻗﯩﻠﯩﻘﻼ ﻣﻪﻗــﺴﻪﺗﻜﻪ- ﺗﯚﯞﻩﻧــﺪﯨﻜﻰ ﺑﯩــﺮ، ﻧﯩــﯔ ﻗﺎﺋﯩﺪﯨـﺴﯩﻨﻰ ﻗﻮﻟﻼﻧــﺴﺎﻕC#3.0 ﺋﻪﮔﻪﺭ
ﻳﯧﺘﻪﻟﻪﻳﻤﯩﺰ
2.31 ﻛﻮﺩ
Rectangle r = new Rectangle {
TL = new Point { X = 0, Y = 1 },
BR = new Point { X = 2, Y = 3 }
};
ﻳﺎﻛﻰ
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 31
Rectangle r = new Rectangle {
TL = { X = 0, Y = 1 },
BR = { X = 2, Y = 3 }
};
ﺋﻪﮔﻪﺭ ﻗﯘﺭﻣﺎﻗﭽﻰ ﺑﻮﻟﻐﯩﻨﯩﯖﯩﺰ ﻣﻪﻟﯘﻡ ﺗﯜﺭﻧﯩﯔ ﺗﯩﺰﯨﻤﻠﯩﻜﻰ ﺑﻮﻟﺴﺎ ﻳﯘﻗﯩﺮﯨﻘﻰ ﻗﺎﺋﯩﺪﻩ ﻳﻪﻧﯩﻼ ﻛﯜﭼﻜﻪ ﺋﯩﮕﻪ:
ﻛﻮﺩ 2.32
List<int> integers = new List<int> { 1, 3, 9, 18 };
List<Customer> list = new List<Customer> {
new Customer( "Jack", 28 ) { Country = "USA"},
new Customer { Name = "Paolo" },
new Customer { Name = "Marco", Country = "Italy" },
};
ArrayList integers = new ArrayList() { 1, 3, 9, 18 };
ArrayList list = new ArrayList {
new Customer( "Jack", 28 ) { Country = "USA"},
new Customer { Name = "Paolo" },
new Customer { Name = "Marco", Country = "Italy" },
};
ﻧﺎﻣﺴﯩﺰ ﺗﯩﭗ
ﺋﻮﺑﻴﯧﻜﯩﺘﻼﺭﻧﻰ ﻗﯘﺭﯗﺵ ﯞﻩ ﺩﻩﺳﻠﻪﭘﻠﻪﺷﺘﯜﺭﯛﺵ ﺋﯜﭼﯜﻥ ﺋﻪﻣـﺪﻯ ﻣﻪﺯﻛـﯘﺭ ﺋﻮﺑﻴﯧﻜﯩﺘﻨﯩـﯔ ﻗﺎﻳـﺴﻰ ﺗﯩﭙﻠﯩـﻖ
ﺋﯩﻜﻪﻧﻠﯧﻜﯩﻨﻰ ﺑﯩﻠﯩﺸﻨﯩﯔ ﮬﺎﺟﯩﺘﻰ ﻗﺎﻟﻤﯩـﺪﻯ)ﺯﯙﺯﯛﺭ ﺗﯧﭙﯩﻠـﺴﺎ( .ﺑـﯘ ﺋـﺎﺭﻗﯩﻠﯩﻖ ﻗﯘﺭﯗﻟﻐـﺎﻥ ﺋﻮﺑﻴﯧﻜﯩﺘﻨﯩـﯔ
ﺗﯩﭙﻰ »ﻧﺎﻣﺴﯩﺰ ﺗﯩﭗ« ﺩﻩﭖ ﺋﺎﺗﯩﻠﯩﺪﯗ .ﻣﻪﺳﯩﻠﻪﻥ:
ﻛﻮﺩ 2.33
Customer c1 = new Customer { Name = "Marco", Age=34 };
var c2 = new Customer { Name = "Paolo", Age=30 };
var c3 = new { Name = "Tom", Age = 31 };
var c4 = new { c2.Name, c2.Age };
var c5 = new { c1.Name, c1.Country };
var c6 = new { c1.Country, c1.Name };
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 32
ﺑﯘ ﻳﻪﺭﺩﯨﻜﻰ c1ﺑﯩـﻠﻪﻥ c2ﺋﻮﺑﻴﯧﻜﯩﺘﻼﺭﻧﯩـﯔ ﺗﯩﭙـﻰ ﺑﻮﻟـﺴﺎ »ﻧـﺎﻣﻠﯩﻖ ﺗﯩـﭗ« ﻳﻪﻧـﻰ ﺋﯘﻻﺭﻧﯩـﯔ ﺗﯩﭙـﻰ
.Customerﺑﯘ ﺋﯩﻜﻜﯩﺴﯩﻨﯩﯔ ﺋﺎﺭﯨﺴﯩﺪﯨﻜﻰ c2ﻧﯩﯔ ﻧﯩﻤﯩﺸﻘﺎ Customerﺗﯩﭗ ﺑﻮﻟﯘﭖ ﻗﺎﻟﻐﺎﻧﻠﯩﻘﯩـﺪﯨﻜﻰ
ﺳﻪﯞﻩﺏ ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤﺎﻧﻨﯩﯔ) (编译器ﺟﯜﻣﻠﯩﻨﯩﯔ ﺑﺎﺵ -ﺋﺎﺧﯩﺮﯨﻐـﺎ ﺋﺎﺳﺎﺳـﻪﻥ ﺋﺎﭘﺘﻮﻣﺎﺗﯩـﻚ ﻛﻪﻟﺘـﯜﺭﯛﭖ
ﭼﯩﻘﺎﺭﻏﺎﻧﻠﯩﻘﯩﺪﺍ c3,c4,c5,c6 .ﺋﻮﺑﻴﯧﻜﯩﺘﻼﺭﻧﯩﯔ ﺗﯩﭙﻰ ﺑﻮﻟﺴﺎ »ﻧﺎﻣﺴﯩﺰ ﺗﯩﭗ« ﻳﻪﻧﻰ ﺋﯘﻻﺭﻧﯩﯔ ﺗﯩﭗ
ﻳﻮﻕ Customer) .ﻣﯩﻜﯩـﻦ ﺩﻩﭖ ﺋـﻮﻳﻼﭖ ﻗﺎﻟﻤـﺎﯓ( .ﺳـﻪﯞﻩﺑﻰ ﺋـﯘﻻﺭ ﺋﻮﺭﯗﻧﻼﺷـﻘﺎﻥ ﻗـﯘﺭﻻﺭﺩﺍ ﺋﯘﻻﺭﻧﯩـﯔ
Customerﺋﯩﻜﻪﻧﻠﯧﻜﯩﻨﻰ ﺑﯩﻠﮕﯩﻠﻰ ﺑﻮﻟﯩﺪﯨﻐﺎﻥ ﻳﯧﺘﻪﺭﻟﯩﻚ ﺋﺎﺳﺎﺱ ﻳﻮﻕ.
ﺋﻪﻣﯩــﺴﻪ ﺑــﯘ ﻧﺎﻣــﺴﯩﺰ ﺗﯩﭙﻠﯩــﻖ ﺋﻮﺑﻴﯧﻜﯩﺘﻼﺭﻧﯩــﯔ ﺧﺎﺳــﻠﯩﻘﻠﯩﺮﯨﻨﯩﯔ ﺋﯩــﺴﯩﻤﻠﯩﺮﻯ ﻗﺎﻳــﺴﻰ؟ ﺋﯘﻻﺭﻧﯩــﯔ
ﻗﯩﻤﻤﻪﺗﻠﯩﺮﯨﭽﯘ؟ ﺋﯘﻻﺭﻧﻰ ﻗﺎﻧﺪﺍﻕ ﺯﯨﻴﺎﺭﻩﺕ ﻗﯩﻠﯩﻤﯩﺰ؟
ﺋﯚﺯﯨﻤﯩﺰ ﺑﻪﺭﮔﻪﻥ " "Tomﺑﯩﻠﻪﻥ 31 ﺋﯚﺯﯨﻤﯩﺰ ﺑﻪﺭﮔﻪﻥ Nameﺑﯩﻠﻪﻥ Age c3
c2ﺩﯨـــــــــــــــﻦ c2ﻧﯩـــﯔ ﻣﯘﻧﺎﺳـــﯩﭗ Nameﺑﯩﻠﻪﻥ Age
c2 ﻗﯩﻤﻤﻪﺗﻠﯩﺮﻯ ﺑﯩـﻠﻪﻥ ﺗﻪﻗﻠﯩﺪﻟﯩﯟﺍﻟﺪﻯ c4
ﺋﻮﺧﺸﺎﺵ
c1ﺩﯨـــــــــــــــــــﻦ 1cﻧﯩـــﯔ ﻣﯘﻧﺎﺳـــﯩﭗ Nameﺑﯩﻠﻪﻥ Contry
c1 ﻗﯩﻤﻤﻪﺗﻠﯩﺮﻯ ﺑﯩـﻠﻪﻥ ﺗﻪﻗﻠﯩﺪﻟﯩﯟﺍﻟﺪﻯ c5
ﺋﻮﺧﺸﺎﺵ
c1ﺩﯨـــــــــــــــــﻦ c1ﻧﯩــﯔ ﻣﯘﻧﺎﺳــﯩﭗ Contryﺑﯩﻠﻪﻥ Name
c1 ﻗﯩﻤﻤﻪﺗﻠﯩـــــــــﺮﻯ ﺗﻪﻗﻠﯩﺪﻟﯩﯟﺍﻟﺪﻯ c6
ﺑﯩﻠﻪﻥ ﺋﻮﺧﺸﺎﺵ
Queryﺋﯩﭙﺎﺩﯨﺴﻰ ﺗﻮﻏﯘﺭﻟﯩﻖ ﮬـﺎﺯﯨﺮ ﻛـﯚﭖ ﺗﻮﺧﺘﯩﻠﯩﻠﻤﺎﻳـﺪﯗ .ﺑـﯘ ﺋﯩﭙـﺎﺩﯨﮕﻪ ﺋﺎﺋﯩـﺖ ﻛـﯚﭘﺮﻩﻙ ﻣﻪﺯﻣـﯘﻧﻼﺭ
Linqﻏﺎ ﺋﺎﻻﻗﯩﺪﺍﺭ ﻣﻪﺯﻣﯘﻧﻼﺭﺩﺍ ﺳـﯚﺯﻟﯩﻨﯩﺪﯗ .ﮬـﺎﺯﯨﺮ ﭘﻪﻗﻪﺕ ﺗﯩﭙﯩـﻚ ﺑﻮﻟﻐـﺎﻥ ﺋﯩﺸﻠﯩﺘﯩﻠﯩـﺸﻰ ﯞﻩ ﺋﯘﻧﯩـﯔ
ﺋﻪﯓ ﺋﺎﺧﯩﺮﯨﺪﺍ ﻗﺎﻧﺪﺍﻕ ﻗﯩﻠﯩﭗ Linqﺗﯩﭗ ﻣﯧﺘﻮﺩﻟﯩﺮﯨﻐﺎ ﺋﺎﻳﻠﯩﻨﯩﺪﯨﻐﺎﻧﻠﯩﻘﻰ ﺋﺎﺩﺩﻯ ﭼﯜﺷﻪﻧﺪﯛﺭﯛﻟﯩﺪﯗ.
ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻛﻮﺩﻧﻰ Queryﺋﯩﭙﺎﺩﯨﺴﯩﻨﯩﯔ ﺗﯩﭙﯩﻚ ﻣﯩﺴﺎﻟﻰ ﺩﯦﻴﯩﺸﻜﻪﻥ ﺑﻮﻟﯩﺪﯗ:
var customers = new []{
new { Name = "Marco", Discount = 4.5 },
new { Name = "Paolo", Discount = 3.0 },
new { Name = "Tom", Discount = 3.5 }
};
var query =
from c in customers
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 34
where c.Discount > 3
orderby c.Discount
select new { c.Name, Perc = c.Discount / 100 };
foreach( var x in query ) {
Console.WriteLine( x );
}
ﮬﻪﺭﺑﯩﺮ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ fromﺧﺎﺱ ﺳﯚﺯﯨﺪﯨﻦ ﺑﺎﺷﻠﯩﻨﯩﭗ)ﭼﻮﯓ -ﻛﯩﭽﯩﻚ ﮬﻪﺭﭘﻜﻪ ﺳﻪﺯﮔﯜﺭ(
ﻳﺎ selectﻳﺎ groupﺧﺎﺱ ﺳـﯚﺯﻯ ﺑﯩـﻠﻪﻥ ﺋﺎﺧﯩﺮﻟﯩـﺸﯩﺪﯗ from .ﺧـﺎﺱ ﺳـﯚﺯﻯ Linqﻣﻪﺷـﻐﯘﻻﺗﻰ
ﺋﯧﻠﯩﭗ ﺑﯧﺮﯨﻠﻤﺎﻗﭽﻰ ﺑﻮﻟﻐﺎﻥ ﮬﻪﻣﺪﻩ > IEnumerable<Tﺋﯧﻐﯩﺰﯨﻨﻰ ﺋﻪﻣﻪﻟـﮕﻪ ﺋﺎﺷـﯘﺭﻏﺎﻥ ﺋـﻮﺑﻴﯧﻜﯩﺘﻨﻰ
ﺑﻪﻟﮕﯩﻠﻪﻳﺪﯗ .ﺑﯘ ﻳﻪﺭﺩﯨﻜﻰ > IEnumerable<Tﺋﯧﻐﯩﺰﯨﻨﻰ ﺋﻪﻣﻪﻟـﮕﻪ ﺋﺎﺷـﯘﺭﯗﺵ ﺩﯦﮕﻪﻧﻨـﻰ ﺯﺍﻏـﺮﺍ ﺗﯩـﻞ
ﺋﯧﻴﺘﻘﺎﻧﺪﺍ ﺋﻪﺯﺍﻟﯩﺮﯨﻨﻰ ﺑﯩـﺮ-ﺑﯩـﺮﻟﻪﭖ ﺋﻮﻗـﯘﻏﯩﻠﻰ ﺑﻮﻟﯩـﺪﯗ ،ﻳﻪﻧـﻰ foreachﻧـﻰ ﺋﯩﺸﻠﯩﺘﯩـﺸﻜﻪ ﺑﻮﻟﯩـﺪﯗ
ﺩﯦﮕﻪﻧﻠﯩﻚ.
ﻳﯘﻗﯩﺮﯨﻘﻰ ﻛﻮﺩ ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﺗﻮﭘﻨﻰ ﺑﺎﺭﻟﯩﻘﻘﺎ ﻛﻪﻟﺘﯜﺭﯨﺪﯗ
{ Name = Tom, Perc = 0.035 }
}{ Name = Marco, Perc = 0.045
ﮬﻪﺭﺑﯩﺮ ﺋﯩﭙﺎﺩﻩ ﺧﺎﺱ ﺳﯚﺯﻯ)ﻣﻪﺳﯩﻠﻪﻥ (select :ﻣﻪﻟﯘﻡ ﻛﯚﭘﻤﺎﺱ ﻣﯧﺘﻮﺩﻗﺎ) (generic methodﺑﺎﺭﺍﯞﻩﺭ.
ﺑﯘﻻﺭﺩﯨﻦ ﺷﯘﻧﻰ ﮬﯧﺲ ﻗﯩﻼﻻﻳﻤﯩﺰﻛﻰ ،ﺑﯩﺰ ﻳﯘﻗﯩﺮﯨﺪﺍ ﺳﯚﺯﻟﯩﮕﻪﻥ ﺑﺎﺭﻟﯩﻖ ﻳﯧﯖﻰ ﻗﺎﺋﯩﺪﯨﻠﻪﺭ ﺋﻪﯓ ﺋﺎﺧﯩﺮﯨﺪﺍ
Linqﻏﺎ ﺑﯧﺮﯨﭗ ﺗﺎﻗﯩﺸﯩﺪﯗ .ﻳﻪﻧﻰ varﺑﻮﻟﺴﺎ queryﻧﻪﺗﯩﺠﯩـﺴﯩﻨﻰ ﺋﯧﻨﯩﻘﻼﺷـﻘﺎ ،ﻧﺎﻣـﺴﯩﺰ ﺗﯩـﭗ ﺑﻮﻟـﺴﺎ
queryﻧﻪﺗﯩﺠﯩــــﺴﯩﻨﻰ ﺳﺎﻗﻼﺷــــﻘﺎ from ،Select .ﻣﻪﺷــــﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺑﻮﻟــــﺴﺎ ﻣﯘﻧﺎﺳــــﯩﭗ Linq
ﻣﯩﺰﻭﺗﻠﯩﺮﯨﻨﯩﯔ ﺋﻮﺭﻧﯩﻐﺎ ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺪﯗ.
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 35
ﺯﺍﻣﺎﻧﯩﯟﻯ ﭘﺮﻭﮔﺮﺍﻣﻤﺎ ﺗﯩﻠﻰ ﯞﻩ ﻳﯘﻣﺸﺎﻕ ﺩﯦﺘـﺎﻟﻼﺭ ﺋﺎﺳﺎﺳـﻪﻥ ﺩﯦﮕﯩـﺪﻩﻙ ﺋﻮﺑﻴﯧﻜﯩﺘﻘـﺎ ﻳـﯜﺯﻟﻪﻧﮕﻪﻥ ﻗﯘﺭﯗﻟﻤـﺎ
ﺗﻪﺭﻩﭘـﺪﺍﺭﻯ ﺑﻮﻟﯘﯞﺍﺗﯩــﺪﯗ .ﻧﻪﺗﯩﺠﯩــﺪﻩ ﺑﯩﺰﻧﯩــﯔ ﻛــﯚﭖ ﻗﯩــﺴﯩﻢ ﻣﻪﺷــﻐﯘﻻﺗﻠﯩﺮﯨﻤﯩﺰ ﺟﻪﺩﯞﻩﻝ ﯞﻩ ﺭﯦﻜــﻮﺭﺗﻼﺭ
ﺑﯩﻠﻪﻥ ﺋﻪﻣﻪﺱ ﺑﻪﻟﻜﻰ ﺋﻮﺑﻴﯧﻜﯩﺖ ﺗﻮﭘﻼﻣﻠﯩﺮﻯ ﯞﻩ ﺋﯘﻻﺭﻧﯩﯔ ﺋﻪﺯﺍﻟﯩﺮﻯ ﺑﯩﻠﻪﻥ ﮬﻪﭘﯩﻠﯩﺸﯩﺶ ﺑﻮﻟﯩﯟﺍﺗﯩـﺪﯗ.
ﺷــﯘ ﺳــﻪﯞﻩﺑﻠﯩﻚ ﭘﺮﻭﮔﺮﺍﻣﻤــﺎ ﺗﯩﻠﻠﯩــﺮﻯ ﺋﺎﻣــﺎﻝ ﺑــﺎﺭ ﻣــﯘﻗﯩﻢ ﺳــﺎﻥ ﻣﻪﻧﺒﻪﻟﯩﺮﯨﻨــﻰ)ﻣﻪﺳــﯩﻠﻪﻥ :ﺳــﺎﻧﺪﺍﻥ(
ﭘﺮﻭﮔﺮﺍﻣﻤﯩﺮﯨــﺪﯨﻦ ﺋــﺎﻳﺮﯨﺶ ﻳــﻮﻟﻠﯩﺮﻯ ﺋﯜﺳــﺘﯩﺪﻩ ﺋﯩﺰﺩﯨﻨﯩﯟﺍﺗﯩــﺪﯗ .ﺗﯩﻠﻐــﺎ ﺋﻮﺭﻧﯩﺘﯩﻠﻐــﺎﻥ ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻙ
) (Language Integrated Queryﻳﻪﻧــﻰ ﺋﺎﺗــﺎﻟﻤﯩﺶ Linqﭘﺮﻭﮔﺮﺍﻣﻤﯩﺮﻻﺭﻧــﻰ ﺗﺎﺭﻣــﺎﻗﭽﯩﻼﺭ ﺗﯩﺰﻣﯩــﺴﻰ
،database )ﻳﻪﻧــﻰ ﺋــﻮﺑﻴﯧﻜﯩﺘﻼﺭ ،objectsﮔﻪﯞﺩﯨــﻠﻪﺭ ،entitiesﺳــﺎﻧﺪﺍﻥ ﺭﯦﻜــﻮﺭﺗﻠﯩﺮﻯ records
XMLﻧــﯘﺧﺘﯩﻠﯩﺮﻯ ﻗﺎﺗــﺎﺭﻟﯩﻘﻼﺭ( ﻏــﺎ ﻧﯩــﺴﺒﻪﺗﻪﻥ ﺋﯜﻧﯜﻣﻠــﯜﻙ ﻣﻪﺷــﻐﯘﻻﺕ ﻗﯩﻠﯩــﺶ ﭼﺎﺭﯨــﺴﻰ ﺑﯩــﻠﻪﻥ
ﺗﻪﻣﯩﻨﻠﻪﻳــﺪﯗ .ﺋﯘﻧﯩــﯔ ﺋﻪﯓ ﺋﯘﺗﯘﻗﻠــﯘﻕ ﻳﯧــﺮﻯ ﺷــﯘﻛﻰ ﺋــﯘ ﺗﯩﺰﻣﯩﻼﺭﻏــﺎ )ﺳــﺎﻧﺪﺍﻧﻤﯘ ﺷــﯘ( ﻻﺭﻏــﺎ ﺑﻮﻟﻐــﺎﻥ
ﻣﻪﺷــﻐﯘﻻﺗﯩﯖﯩﺰﻧﻰ ﭘﺮﻭﮔﺮﺍﻣﻤــﺎ ﺗﯩﻠــﻰ ﺑﯩــﻠﻪﻥ ﻳﯜﻛــﺴﻪﻙ ﺩﻩﺭﯨﺠﯩــﺪﻩ ﻳﯧﻘﯩﻨﻼﺷــﺘﯘﺭﻏﺎﻥ ﺑﻮﻟــﯘﭖ ﭘﺮﻭﮔﺮﺍﻣﻤــﺎ
ﺗﯩﻠﯩﻨﯩﯔ ﺋﺎﺩﺩﻯ ﻗﺎﺋﯩﺪﯨﻠﯩﺮﻯ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻣﯘﺭﻩﻛﻜﻪﭖ ﻣﻪﺷﻐﯘﻻﺗﻼﺭﻧﻰ)ﻣﻪﺳﯩﻠﻪﻥ ﺳـﺎﻧﺪﺍﻥ ﻣﻪﺷـﻐﯘﻻﺗﻠﯩﺮﻯ(
ﺋﯩﻠﯩﭗ ﺑﺎﺭﺍﻻﻳﺴﯩﺰ.
ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩﺴﻰ
ﮔﺮﺍﻣﻤﺎﺗﯩﻜﯩﻨﻰ ﺳﯚﺯﻟﻪﺷﺘﯩﻦ ﺑﯘﺭﯗﻥ ﮔﻪﭘﻨﻰ ﺋﺎﺩﺩﻯ ﻣﯩﺴﺎﻝ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺑﺎﺷﻼﻱ .ﺗﯚﯞﻩﻧﺪﯨﻜﻪﻥ ﺗﯜﺭ ﺑﺎﺭ ﺩﻩﭖ
ﭘﻪﺭﻩﺯ ﻗﯩﻼﻳﻠﻰ
{public class Developer ﭘﺮﻭﮔﺮﺍﻣﻤﯩﺮ ﺗﯜﺭﻯ//
public string Name;
public string Language;
public int Age;
}
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 36
ﻳﯘﻗﺎﺭﻗﻰ ﺗﯜﺭ ﺗﯩﭙﯩﻨﯩﯔ ﺗﻮﭘﻠﯩﻤﯩﻐﺎ ﻣﻪﺷﻐﯘﻻﺕ ﺋﯧﻠﯩﭗ ﺑﺎﺭﻣﺎﻗﭽﻰ ﺑﻮﻟﯘﯓ Linq To Objects .ﺋﺎﺭﻗﯩﻠﯩﻖ
ﻣﻪﺯﻛﯘﺭ ﺗﻮﭘﺘﯩﻜﻰ C#ﺗﯩﻠﯩﻨﻰ ﺋﯩﺸﻠﯩﺘﯩﺪﯨﻐﺎﻥ ﭘﺮﻭﮔﺮﺍﻣﻤﯩﺮﻻﺭﻧﯩﯔ ﻧﺎﻣﯩﻨﻰ ﺑﯧﺴﯩﭗ ﭼﯩﻘﯩﺮﯨﺶ ﺋﯜﭼﯜﻥ
ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻛﻮﺩ ﻳﯧﺰﯨﻠﯩﺸﻰ ﻣﯘﻣﻜﯩﻦ
ﻛﻮﺩ 4.1
using System;
using System.Linq;
using System.Collections.Generic;
class app {
static void Main() {
Developer[] developers = new Developer[] {
new Developer {Name = "Paolo", Language = "C#"},
new Developer {Name = "Marco", Language = "C#"},
new Developer {Name = "Frank", Language = "VB.NET"}};
IEnumerable<string> developersUsingCsharp =
from d in developers
where d.Language == "C#"
select d.Name;
foreach (string item in developersUsingCsharp) {
Console.WriteLine(item);
}
}
}
C#3.0ﻛﻮﺩ-ﺗﻪﺭﺟﯩﻤﺎﻧﻰ ﻳﯘﻗﯩﺮﯨﻘﻰ ﮬﺎﻟﻪﺗﻜﻪ ﻗﺎﻧﺪﺍﻕ ﻛﻪﻟﺘﯜﺭﯛﺷﻨﻰ ﺑﯩﻠﯩﺪﯗ .ﺋﻪﻟﯟﻩﺗﺘﻪ ﺋﻪﮔﻪﺭ ﺳﯩﺰ Linq
ﺑﯩﻠﯩﻤﻠﯩﺮﯨﻨﻰ ﭘﯩﺸﺸﯩﻖ ﺑﯩﻠﯩﭗ ﺑﻮﻟﻐﺎﻧﺪﯨﻦ ﻛﯧﻴﯩﻦ ﺑﯩﯟﺍﺳﺘﻪ ﻣﯘﺷﯘ ﺧﯩﻞ ﮔﯩﺮﺍﻣﺎﺗﯩﻜﯩﻨﻰ ﻗﻮﻟﻼﻧﺴﯩﯖﯩﺰﻣﯘ
ﺑﻮﻟﯩﺪﯗ .ﻟﯧﻜﯩﻦ ﺗﻪﺷﻪﺑﺒﯘﺳﯘﻡ ﺷﯘﻛﻰ ﺯﯙﺭﯛﺭﯨﻴﻪﺕ ﺗﯘﻏﯘﻟﻤﯩﺴﯩﻼ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﯩﻨﻰ ﺋﯩﺸﻠﯩﺘﯩﯔ.
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 38
ﺗﯘﻧﺠﻰ 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ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 41
ﻛﻮﺩ 4.3
var expr =
from c in customers
where c.Country == Countries.Italy
select new { c.Name, c.City };
ﻗﯧﻠﯩﭗ ﻛﻮﺩﯨﺪﯨﻦ ﺷﯘﻧﻰ ﻛﯚﺭﯛﯞﯦﻠﯩﺸﻘﺎ ﺑﻮﻟﯩﺪﯗ Where ،ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﯩﯔ ﺋﻪﻣﻪﻟﯩﻴﻪﺗﺘﻪ ﺋﯩﻜﻜـﻰ ﺧﯩـﻞ
ﺋﻪﻧﺪﯨﺰﯨﺴﻰ ﺑﺎﺭ ﺑﻮﻟﯘﭖ ،ﺑﯩﺰ ﻳﯘﻗﯩﺮﯨﺪﺍ ﺋﯩﺸﻠﻪﺗﻜﯩﻨﻰ ﺑﯩﺮﯨﻨﭽﻰ ﺧﯩﻠﻰ .ﻳﻪﻧﻪ ﺑﯩﺮ ﺧﯩﻠﯩـﺪﺍ ﺑﻮﻟـﺴﺎ ﭘﯜﺗـﯜﻥ
ﺳــﺎﻥ ﺗﯩﭙﻠﯩــﻖ ﭘــﺎﺭﺍﻣﯧﺘﯩﺮ ﺑﯧﻜﯩﺘﻪﻟﻪﻳﻤﯩــﺰ .ﺋــﯘ ﻧــﯚﯞﻩﺗﺘﯩﻜﻰ ﺋﻮﺑﻴﯧﻜﯩﺘﻨﯩــﯔ ﺭﻩﺕ ﺗﻪﺭﺗﯩــﯟﯨﻨﻰ ﺑﯩﻠﺪﯛﺭﯨــﺪﯗ.
ﻣﻪﺳﻠﻪﻥ:
ﻛﻮﺩ 4.4
var expr =
customers
.Where((c, index) => (c.Country == Countries.Italy && index >= 1))
.Select(c => c.Name);
ﺑـﯘ ﺋﯩﭙـﺎﺩﻩ ﺗﻪﺭﺗﯩـﭗ ﻧﻮﻣـﯘﺭﻯ 0ﺑﻮﻟﻐـﺎﻥ ﺧﯧﺮﯨـﺪﺍﺭ )ﻳﻪﻧـﻰ Paoloﺋﯩـﺴﯩﻤﻠﯩﻚ ﺧﯧﺮﯨـﺪﺍﺭ( index>=1
ﺷﻪﺭﺗﯩﻨﻰ ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﺪﯛﺭﻣﯩﮕﻪﭼﻜﻪ ﻧﻪﺗﯩﺠﻪ ﺗﻮﭘﻠﯩﻤﯩﻐﺎ ﻛﯩﺮﻩﻟﻤﻪﻳﺪﯗ.
ﺋﻪﭘﺴﯘﺳﻠﯩﻨﺎﺭﻟﯩﻖ ﻳﯧﺮﻯ ﺷﯘﻛﻰ ،ﺋﯩﻜﻜﯩﭽﻰ ﺧﯩﻞ ﺋﻪﻧـﺪﯨﺰﯨﻨﻰ ﺳﯜﺭﯛﺷـﺘﯜﺗﯜﻙ ﺋﯩﭙﺎﺩﺳـﯩﺪﻩ ﺋﯩﭙـﺎﺩﯨﻠﯩﮕﯩﻠﻰ
ﺑﻮﻟﻤﺎﻳﺪﯗ ) … from….where….selectﺋﺎﺭﻗﯩﻠﯩﻖ ﺩﯦﻤﻪﻛﭽﻰ(.
ﺷﯘﻧﯩﺴﻰ ﺋﯧﺴﯩﯖﯩﯩﺰﺩﻩ ﺗﯘﺭﺳﯘﻧﻜﻰ ،ﻧﻮﺭﻣﺎﻝ ﮬﺎﻟﻪﺗﺘﻪ ﺗﯘﺭﻏﯘﻥ ﻗﻪﯞﻩﺕ ) ،persistence layerﻣﻪﺳـﯩﻠﻪﻥ:
ﺳﺎﻧﺪﺍﻥ( ﺩﯨﻦ ﻛﯚﭖ ﻣﯩﻘﺪﺍﺭﺩﯨﻜﻰ ﺋﯘﭼﯘﺭﻧﻰ ﺋﯩﭽﻜﻰ ﺳﺎﻗﻠﯩﻐﯘﭼﻘﺎ ﺋﻮﻗﯘﭖ ﻛﯩﺮﯨـﺸﻨﻰ ﻳﺎﺧـﺸﻰ ﻣﻪﺷـﻐﯘﻻﺕ
ﺩﯦﮕﯩﻠﻰ ﺑﻮﻟﻤﺎﻳﺪﯗ .ﺋﺎﺩﻩﺗﺘﻪ ،ﺋﯘﭼﯘﺭﻻﺭﻧﻰ ﺗﯘﺭﻏﯘﻥ ﻗﻪﯞﻩﺕ ﺩﻩﺭﯨﺠﯩﺴﯩﺪﯨﻼ ﺑﻪﺗﻠﻪﺭﮔﻪ ﺑـﯚﻟﮕﻪﻥ)ﺷـﻪﺭﺗﻠﻪﺭ
ﺋﺎﺭﻗﯩﻠﯩﻖ( ﻳﺎﺧﺸﻰ .ﮔﻪﺭﭼﻪ ﺑﯘ ﺧﯩﻞ ﺋﯘﺳﯘﻝ ﺑﺎﺭﻟﯩﻖ ﺋﯘﭼﯘﺭﻧﻰ ﺋﯩﭽﻜـﻰ ﺳـﺎﻗﻠﯩﻐﯘﭼﺘﺎ ﺗـﯘﺭﯗﭖ ﺑﻪﺗـﻠﻪﺭﮔﻪ
ﺑﯚﻟﮕﻪﻧﮕﻪ ﻗﺎﺭﯨﻐﺎﻥ ﺋﺎﺳﺘﯩﺮﺍﻕ)ﻧﯩﺴﭙﻰ( ﺑﻮﻟﺴﯩﻤﯘ ،ﻳﻪﻧﯩﻼ ﭼﻮﻗﯘﻡ ﻛﯩﺮﯨﺶ ﺟﻪﺭﻳﺎﻧﯩﻐﺎ ﻛﻪﺗـﻜﻪﻥ ﯞﺍﻗﯩﺘـﺘﯩﻦ
ﺋﯘﺗﺎﻻﻳﻤﯩﺰ.
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 42
Selectﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ
ﺋﻪﻣﻪﻟﯩﻠﻪﺷــﺘﯜﺭﯛﺵ ﻣﻪﺷــﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﻣﻪﻧــﺒﻪﺩﯨﻦ ﺋﯘﭼــﯘﺭﻻﺭﻧﻰ ﺷــﻪﺭﺗﻜﻪ ﺋﺎﺳﺎﺳــﻪﻥ ﻳﯩﻐﯩــﭗ ﻧﻪﺗﯩﺠﯩــﮕﻪ
ﺋﻮﺭﯗﻧﻼﺷﺘﯘﺭﯗﺵ ﺭﻭﻟﯩﻨﻰ ﺋﻮﻳﻨﺎﻳﺪﯗ .ﻳﯘﻗﯩﺮﯨﺪﺍ ﻛﯚﭖ ﺋﯘﭼﺮﺍﺗﻘﺎﻥ Selectﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﺋﯘﻧﯩﯔ ﺗﯩﭙﯩﻚ
ﻣﯩــﺴﺎﻟﻰ .ﺑﯘﻧــﺪﺍﻕ ﺩﯦﻴﯩــﺸﯩﻤﯩﺰﯨﺪﯨﻜﻰ ﺳــﻪﯞﻩﺏ ﺋــﯘ ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻙ ﻧﻪﺗﯩﺠﯩــﺴﯩﻨﻰ >IEnumerable<T
ﺋﯧﻐﯩﺰﯨﻨﻰ ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﺎﻥ ﺋﻮﺑﻴﯧﻜﯩﺖ ﮬﺎﻟﯩﺘﯩﺪﻩ ﻗﺎﻳﺘﯘﺭﯗﭖ ﺑﯧﺮﻩﻟﻪﻳﺪﯗ.
Selectﻣﻪﺷﻐﯘﻻﺗﭽﯩﻨﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﺴﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﯩﺪﻩﻙ:
public static IEnumerable<S> Select<T, S>(
this IEnumerable<T> source,
Func<T, S> selector);
public static IEnumerable<S> Select<T, S>(
this IEnumerable<T> source,
;) Func<T, int, S> selector
ﺑﯘ ﺟﯜﻣﻠﯩﺪﯨﻦ ﻗﺎﻳﺘﯩـﺪﯨﻐﯩﻨﻰ Nameﯞﻩ Cityﺩﯨـﻦ ﺋﯩﺒـﺎﺭﻩﺕ ﺋﯩﻜﻜـﻰ ﺩﺍﻧﻪ ﺧﺎﺳـﻠﯩﻘﻰ ﺑﻮﻟﻐـﺎﻥ ﻧﺎﻣـﺴﯩﺰ
ﺗﯩﭙﻠﯩﻖ ﺋﻮﺑﻴﯧﻜﯩﺘﻼﺭ ﺗﯩﺰﻣﯩﺴﻰ ﺑﻮﻟﯘﭖ ،ﺋﯘ ﺧﺎﺳﻠﯩﻘﻠﯩﺮﻧﯩﯔ ﻗﯩﻤﻤﯩﺘـﻰ ﻣﻪﻧـﺒﻪ ﺧﯧﺮﯨـﺪﺍﺭﻻﺭ ﺗﯩﺰﻣﯩـﺴﯩﺪﯨﻜﻰ
) (customersﻳﻪﻛﻜﻪ ﺧﯧﺮﯨﺪﺍﺭ ﺋﻮﺑﻴﯧﻜﯩﺘﯩﺪﯨﻦ ﻛﯧﻠﯩﺪﯗ.
SelectManyﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ
ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻜﻰ Italyﺑﻮﻟﻐﺎﻥ ﺑﺎﺭﻟﯩﻖ ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﯩﯔ ﺑﺎﺭﻟﯩﻖ ﺯﺍﻛﺎﺯﻟﯩﺮﯨﻐﺎ ﺋﯧﺮﯨـﺸﻤﻪﻛﭽﻰ ﺑﻮﻟـﺴﯩﯖﯩﺰ.
ﺑﯘﻧﯩﯔ ﺋﯜﭼﯜﻥ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻛﻮﺩ ﻳﯧﺰﻯ ﻳﯧﺰﯨﺸﯩﯖﯩﺰ ﻣﯘﻣﻜﯩﻦ:
ﻛﻮﺩ 4.6
var orders =
customers
.Where(c => c.Country == Countries.Italy)
.Select(c => c.Orders);
foreach(var item in orders) { Console.WriteLine(item); }
ﻛﻮﺩ 4.7
IEnumerable<Order> orders =
customers
.Where(c => c.Country == Countries.Italy)
.SelectMany(c => c.Orders);
IEnumerable<Order> orders =
from c in customers
where c.Country == Countries.Italy
from o in c.Orders
select o;
IEnumerable<Order> 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ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 45
OrderByﺑﯩﻠﻪﻥ OrderByDescendingﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ
ﺋﻪﮔﻪﺭ Sqlﺋﺎﺭﻗﯩﻠﯩﻖ ﺳﺎﻧﺪﺍﻥ ﻣﻪﺷﻐﯘﻻﺗﻰ ﺋﯧﻠﯩﭗ ﺑﯧﺮﯨﭗ ﺑﺎﻗﻘﺎ ﺑﻮﻟﺴﯩﯖﯩﺰ ﻧﻪﺗﯩﺠﯩﻠﻪﺭﻧﻰ ﻣﻪﻟﯘﻡ ﺷﻪﺭﺗﻜﻪ
ﺋﺎﺳﺎﺳﻪﻥ ﺳﻮﺭﺗﻼﺵ)ﺗﯩﺰﯨﺶ( ﻧﯩﯔ ﻣﯘﮬﯩﻢ ﻧﯘﺧﺘﺎ ﺋﯩﻜﻪﻧﻠﯩﻜﯩﻨﻰ ﺋﻪﺳﻜﻪﺭﺗﯩﺸﯩﯖﯩﺰﻧﯩﯔ ﮬﺎﺟﯩﺘﻰ ﻳﻮﻕ.
Linqﺑﻮﻟﺴﺎ orderingﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﻧﻪﺗﯩﺠﯩﺴﯩﮕﻪ ﺋﺎﺷﻤﺎ ﻳﺎﻛﻰ ﻛﯧﻤﻪﻳﺘﯩﻠﯩﻚ
ﺳﻮﺭﺗﻼﺵ ﺋﯧﻠﯩﭗ ﺑﺎﺭﺍﻻﻳﺪﯗ .ﻣﻪﺳﯩﻠﻪﻥ :ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻜﻰ Italyﺑﻮﻟﻐﺎﻥ ﺧﯧﺮﯨﺪﺍﺭﻻﺭﻧﯩﯔ ﻧﺎﻣﻰ ﺑﯩﻠﻪﻥ
ﺷﻪﮬﻪﺭ ﺧﺎﺳﻠﯩﻘﻠﯩﺮﯨﻐﺎ ﻧﺎﻣﯩﻨﯩﯔ ﺋﺎﻟﻔﺎﺑﯩﺖ ﺟﻪﺩﯞﯦﻠﯩﺪﯨﻜﻰ)ﺋﯧﻨﮕﯩﻠﯩﺰﻻﺭﻧﯩﯔ ﺋﯧﻠﯩﭙﺒﻪ ﺗﻪﺭﺗﯩﭙﻰ( ﻛﯧﻤﯩﻴﯩﭗ
ﺑﯧﺮﯨﺶ ﺗﻪﺭﺗﯩﭙﻰ ﺑﻮﻳﯩﭽﻪ ﺗﯩﺰﯨﻠﻐﺎﻥ ﮬﺎﻟﯩﺘﯩﺪﻩ ﺋﯧﺮﯨﺸﯩﺶ ﺋﯜﭼﯜﻥ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺪﻩﻙ ﻛﻮﺩ ﻳﯧﺰﯨﺶ ﻣﯘﻣﻜﯩﻦ:
ﻛﻮﺩ 4.11
var expr =
from c in customers
where c.Country == Countries.Italy
orderby c.Name descending
select new { c.Name, c.City };
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<T> ThenBy<T, K>(
this IOrderedSequence<T> source,
Func<T, K> keySelector);
public static IOrderedSequence<T> ThenBy<T, K>(
this IOrderedSequence<T> source,
Func<T, K> keySelector,
IComparer<K> comparer);
public static IOrderedSequence<T> ThenByDescending<T, K>(
this IOrderedSequence<T> source,
Func<T, K> keySelector);
public static IOrderedSequence<T> ThenByDescending<T, K>(
this IOrderedSequence<T> source,
Func<T, K> keySelector,
IComparer<K> comparer);
ﻛﻮﺩ 4.12
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ﺋﺎﺷﻤﯩﺴﻰ ﺑﻮﻳﯩﭽﻪ ﺗﯩﺰﯨﺪﯗ.
ﻳﯘﻗﯩﺮﯨﻘﻰ ﺟﯜﻣﻠﯩﻠﻪﺭﻧﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻣﯘﻧﺪﺍﻕ ﺋﯩﭙﺎﺩﯨﻠﻪﺵ ﻣﯘﻣﻜﯩﻦ:
ﻛﻮﺩ 4.12
var expr =
from c in customers
where c.Country == Countries.Italy
orderby c.Name descending, c.City
select new { c.Name, c.City };
using System.Globalization;
private class UyghurComparer: IComparer<string> {
public int Compare(string x, string y) {
} }
IEnumerable<Order> orders =
customers
.SelectMany(c => c.Orders)
.OrderBy(o => o.Month, new MonthComparer());
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 48
Reverceﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ )ﻛﯚﻣﺘﯜﺭﯛﺵ(
ﺑﻪﺯﯨﺪﻩ ﻧﻪﺗﯩﺠﻪ ﺗﯩﺰﻣﯩﺴﯩﻨﯩﻨﯩﯔ ﺗﻪﺭﺗﯩﭙﯩﻨﻰ ﺋﻪﻛﺴﯩﮕﻪ ﺋﯚﺭﯛﺵ ﺋﯧﮫﺘﯩﻴـﺎﺟﻰ ﺗﯘﻏﯘﻟﯩـﺪﯗ Linq .ﺩﺍ ﺑﯘﻧـﺪﺍﻕ
ﺋﻪﮬﯟﺍﻟﻐﺎ ﻧﯩﺴﺒﻪﺗﻪﻥ Reverceﻧﺎﻣﻠﯩﻖ ﻛﯧﯖﻪﻳﺘﯩﻠﻤﻪ ﻣﯧﺘﻮﺩ ﺗﻪﻣﯩﻨﻠﻪﻧﮕﻪﻥ .ﻳﻪﻧﻰ:
public static IEnumerable<T> Reverse<T>(
this IEnumerable<T> source);
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
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ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 49
public static IEnumerable<IGrouping<K, T>> GroupBy<T, K>(
this IEnumerable<T> source, Func<T, K> keySelector);
public static IEnumerable<IGrouping<K, T>> GroupBy<T, K>(
this IEnumerable<T> source, Func<T, K> keySelector,
IEqualityComparer<K> comparer);
public static IEnumerable<IGrouping<K, E>> GroupBy<T, K, E>(
this IEnumerable<T> source, Func<T, K> keySelector,
Func<T, E> elementSelector);
public static IEnumerable<IGrouping<K, E>> GroupBy<T, K, E>(
this IEnumerable<T> source, Func<T, K> keySelector,
Func<T, E> elementSelector, IEqualityComparer<K> comparer);
var expr = customers.GroupBy(c => c.Country);
foreach(IGrouping<Countries, Customer> customerGroup in expr) {
Console.WriteLine("Country: {0}", customerGroup.Key);
foreach(var item in customerGroup) {
Console.WriteLine(item);
}
}
4.17 ﻛﻮﺩ
var expr =
from c in customers
group c by c.Country;
foreach(IGrouping<Countries, Customer> customerGroup in expr) {
Console.WriteLine("Country: {0}", customerGroup.Key);
foreach(var item in customerGroup) {
Console.WriteLine(item);
}
}
ﻧﯩﯔ ﺋﻪﯓGroupBy ﺑﯘ ﻗﯧﺘﯩﻢ. ﺩﺍ ﮔﯘﺭﭘﯩﻼﺷﻘﺎ ﺋﺎﻻﻗﯩﺪﺍﺭ ﻳﻪﻧﻪ ﺑﯩﺮ ﺧﯩﻞ ﻣﯩﺴﺎﻝ ﺑﯧﺮﯨﻠﺪﻯ4.18 ﻛﻮﺩ
.ﺋﺎﺧﯩﺮﯨﻘﻰ ﺋﻪﻧﺪﯨﺰﯨﺴﻰ ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺪﯗ
4.18 ﻛﻮﺩ
var expr =
customers
.GroupBy(c => c.Country, c => c.Name);
foreach(IGrouping<Countries, string> customerGroup in expr) {
Console.WriteLine("Country: {0}", customerGroup.Key);
foreach(var item in customerGroup) {
Console.WriteLine(" {0}", item);
}
}
Joinﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﮬﻪﻣﺪﻩﻡ(
Joinﻣﻪﺷـــﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ Linqﺳﯜﺭﯛﺷـــﺘﯜﺭﯛﻙ ﺋﯩﭽﯩـــﺪﯨﻜﻰ ﺗﯩﺰﻣﯩﻠﯩـــﺮﻯ ﺋﺎﺭﯨـــﺴﯩﺪﯨﻜﻰ ﻣﯘﻧﺎﺳـــﯩﯟﻩﺗﻨﻰ
ﺑﻪﻟﮕﯩﻠﻪﺷــﻜﻪ ﺋﯩــﺸﻠﯩﺘﯩﻠﯩﺪﯗ SQL .ﺳــﺎﻧﺪﺍﻥ ﻣﻪﺷــﻐﯘﻻﺗﯩﻨﻰ ﺋﯧﻠﯩــﭗ ﺋﯧﻴﺘــﺴﺎﻕ ﺋﺎﺳﺎﺳــﻪﻥ ﮬﻪﺭﻗﺎﻧــﺪﺍﻕ
ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺑﯩـﺮ ﻳـﺎﻛﻰ ﺑﯩﺮﻗـﺎﻧﭽﻪ ﺟﻪﺩﯞﻩﻟﻨـﻰ ﮬﻪﻣﺪﻩﻣﻠﻪﺷـﺘﯜﺭﯨﺪﯗ Linq .ﺩﺍ ،ﺑﯩـﺮ ﻗﯩـﺴﯩﻢ ﮬﻪﻣـﺪﻩﻡ
ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﻳﯘﻗﯩﺮﯨﻘﯩﺪﻩﻙ ﺧﯘﻟﻘﻨﻰ ﺋﯚﺯﯨﮕﻪ ﻣﯘﺟﻪﺳﺴﻪﻣﻠﻪﺷﺘﯜﺭﮔﻪﻥ.
) Joinﮬﻪﻣﺪﻩﻡ (
ﺷﻪﻙ-ﺷﯚﺑﯩﺴﯩﺰﻛﻰ Joinﺑﻮﻟﺴﺎ ﮬﻪﻣﺪﻩﻡ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺋﯩﭽﯩـﺪﯨﻜﻰ ﺗـﯘﻧﺠﻰ ﻣﻪﺷـﻐﯘﻻﺗﭽﻰ .ﺋﯘﻧﯩـﯔ
ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ:
public static IEnumerable<V> Join<T, U, K, V>(
this IEnumerable<T> outer,
IEnumerable<U> inner,
Func<T, K> outerKeySelector,
Func<U, K> innerKeySelector,
Func<T, U, V> resultSelector);
public static IEnumerable<V> Join<T, U, K, V>(
this IEnumerable<T> outer,
IEnumerable<U> inner,
Func<T, K> outerKeySelector,
Func<U, K> innerKeySelector,
Func<T, U, V> resultSelector,
IEqualityComparer<K> comparer);
Joinﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﭘﺎﺭﺍﻣﯧﺘﯩﺮﺩﺍ ﺗﯚﺕ ﺩﺍﻧﻪ ﻛﯚﭘﻤﺎﺱ ﺗﯩﭙﻨﯩﯔ ﻳﻮﻟﻠﯩﻨﯩﺸﯩﻨﻰ ﺗﻪﻟﻪﭖ ﻗﯩﻠﯩﺪﯗ T .ﺑﻮﻟـﺴﺎ
ﺳﯩﺮﺗﻘﻰ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﺎ ﺗﯩﭙﯩﻐﺎ ﯞﻩﻛﯩﻠﻠﯩﻚ ﻗﯩﻠﯩﺪﯗ U ،ﺑﻮﻟﺴﺎ ﺋﯩﭽﻜﻰ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣـﺎ ﺗﯩﭙﯩﻨـﻰ ﺋﯩﭙﺎﺩﯨﻠﻪﻳـﺪﯗ.
outerKeySelectorﺑﯩـﻠﻪﻥ innerKeySelectorﻻﺭ ﺑﻮﻟـﺴﺎ ﺳـﯩﺮﺗﻘﻰ ﯞﻩ ﺋﯩﭽﻜـﻰ ﻣﻪﻧـﺒﻪ ﻛﯚﺭﺳـﻪﺗﻤﻪ
ﺗﯩﺰﻣﯩﻠﯩﺮﯨــﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭﻧﯩــﯔ ﺋــﺎﭼﻘﯘﭼﻠﯘﻕ ﺳــﯚﺯﻟﯩﺮﯨﻨﻰ ﻗﺎﻧــﺪﺍﻕ ﭘﻪﺭﻕ ﺋﯧﺘﯩــﺸﻨﻰ ﺋﯧﻴﺘﯩــﭗ ﺑﯧﺮﯨــﺪﯗ .ﺑــﯘ
ﺋﺎﭼﻘﯘﭼﻠﯘﻕ ﺳﯚﺯﻟﻪﺭﻧﻰ ﮬﻪﺭ ﺋﯩﻜﻜﯩﻠﯩﺴﻰ Kﺗﯩﭙﻠﯩﻖ ﺑﻮﻟﯘﭖ Join ،ﺋﯘﻻﺭﻧﯩﯔ ﺗﻪﯕﻠﯧﻜﯩﻨﻰ ﺋﯚﺯﯨﮕﻪ ﺷﻪﺭﺕ
ﻗﯩﻠﯩﺪﯗ V .ﺑﻮﻟﺴﺎ ﺋﺎﯓ ﺋﺎﺧﯩﺮﯨﻘﻰ ﻛﯚﭘﻤﺎﺱ ﺗﯩﭗ ﺑﻮﻟﯘﭖ ﺋﯘ Joinﻧﯩﯔ ﻧﻪﺗﯩﺠﻪ ﺗﯩﺰﻣﯩـﺴﯩﺪﯨﻜﻰ ﮬﻪﺭﺑﯩـﺮ
ﺋﻪﺯﺍﻧﯩﯔ ﺗﯩﭙﯩﻨﻰ ﺋﯩﭙﺎﺩﯨﻠﻪﻳﺪﯗ.
ﺧﯧﺮﯨــﺪﺍﺭﻻﺭﻧﻰ ﺋﯘﻻﺭﻧﯩــﯔ ﺯﺍﻛــﺎﺯﻟﯩﺮﻯ ﯞﻩ. ﻧــﻰ ﻣﯩــﺴﺎﻝ ﺋــﺎﺭﻗﯩﻠﯩﻖ ﭼﯜﺷــﯜﻧﯜﭖ ﺑﺎﻗــﺎﻳﻠﻰ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 });
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
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
ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰGroupJoin
ﻏـﺎ ﺋﻮﺧﺸﯩـﺸﯩﭗ ﻛﯧﺘﯩـﺪﯨﻐﺎﻥRIGHT OUTER JOIN ﻳـﺎﻛﻰLEFT OUTER JOIN ﺩﯨﻜـﻰSql
. ﻣﻪﺷﻐﯘﻻﺗﭽﯩــﺴﻰ ﻳﺎﺧــﺸﻰ ﺗــﺎﻟﻼﺵGroupJoin .ﺋﯩﻘﺘﯩــﺪﺍﺭﻧﻰ ﺋﻪﻣﻪﻟــﮕﻪ ﺋﻪﻣﻪﻟــﮕﻪ ﺋﺎﺷــﯘﺭﯗﺵ ﺋﯜﭼــﯜﻥ
: ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﯩﯖﻜﯩﮕﻪ ﺋﯩﺘﺎﻳﯩﻦ ﺋﻮﺧﺸﯩﺸﯩﭗ ﻛﯧﺘﯩﺪﯗJoin ﺋﯘﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ
public static IEnumerable<V> GroupJoin<T, U, K, V>(
this IEnumerable<T> outer,
IEnumerable<U> inner,
Func<T, K> outerKeySelector,
Func<U, K> innerKeySelector,
Func<T, IEnumerable<U>, V> resultSelector);
public static IEnumerable<V> GroupJoin<T, U, K, V>(
this IEnumerable<T> outer,
IEnumerable<U> inner,
Func<T, TKey> outerKeySelector,
Func<U, TKey> innerKeySelector,
Func<T, IEnumerable<U>, V> resultSelector,
IEqualityComparer<TKey> comparer);
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
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ﺳﻪﭘﯩﺮﯨﻤﯩﺰ ﺋﯘﭼﯘﺭ ﺗﯩﺰﻣﯩﻠﯩﺮﯨﻐﺎ ﺋﯧﻠﯩﭗ ﺑﯧﺮﯨﻠﯩﺪﯨﻐﺎﻥ »ﺑﯩﺮﯨﻜﻤﯩﺴﻰ«» ،ﻛﻪﺳﻤﯩﺴﻰ« ﯞﻩ »ﺩﯨـﻦ
ﺑﺎﺷﻘﺎ« ﻻﺭﺩﻩﻙ ﺋﻪﯓ ﺋﺎﺳﺎﺳﻰ ﻣﻪﺷﻐﯘﻻﺗﻼﺭﻏﺎ ﻛﯧﻠﯩﭗ ﻗﺎﻟﺪﻯ.
ﻛﻮﺩ 4.24
var expr =
customers
.SelectMany(c => c.Orders)
.Join(products,
o => o.IdProduct,
p => p.IdProduct,
(o, p) => p)
.Distinct();
var expr =
(from c in customers
from o in c.Orders
join p in products
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 56
on o.IdProduct equals p.IdProduct
select p
).Distinct();
var expr = customers[1].Orders.Union(customers[2].Orders);
ﻧﻪﺗﯩﺠﻪ ﺋﻮﻳﻠﯩﻐﺎﻥ ﻳﯧﺮﯨﯖﯩﺰﺩﯨﻦ ﭼﯩﻘﻤﯩﻐﺎﻧﺪﻩﻛﻤﯘ؟ ﺋﺎﺧﯩﺮﯨﻘﻰ ﺋﯩﻜﻜﻰ ﻗـﯘﺭ ﺋﻮﭘﻤـﯘ ﺋﻮﺧـﺸﺎﺵ ﺗﯘﺭﯨـﺪﯨﻐﯘ،
ﺋﻪﺟﯩﺒﺎ Distinctﻧﯩﯔ ﺭﻭﻟﻰ ﺑﻮﻟﻤﯩﻐﺎﻧﺪﯨﻤﯘ؟
»ﻣﯩـــﺴﺎﻟﻼﺭ ﺋﯜﭼـــﯜﻥ ﺗـــﯜﺭ ﻗﯘﺭﯗﻟﻤﯩـــﺴﻰ« ﺩﯨﻜـــﻰ ﺧﯧﺮﯨـــﺪﺍﺭ ﺋـــﻮﺑﻴﯧﻜﯩﺘﻠﯩﺮﯨﻨﻰ ﺩﻩﺳﻠﻪﭘﻠﻪﺷـــﺘﯜﺭﯛﺵ
ﻛﻮﺩﯨﻐــﺎ)ﻣﻪﺯﻛــﯘﺭ ﻣﺎﻗﺎﻟﯩــﺪﯨﻜﻰ ﺑــﺎﺭﻟﯩﻖ ﻛــﻮﺩﻻﺭ ﻧﯩــﯔ ﻣﯩــﺴﺎﻝ ﻣﻪﺷــﻐﯘﻻﺕ ﺋــﻮﺑﯩﻜﺘﻰ( ﻧﻪﺯﻩﺭ ﺳــﺎﻟﯩﺪﯨﻐﺎﻥ
ﺑﻮﻟﺴﺎﻕ ،ﺩﻩﺳﻠﻪﭘﻠﻪﺷﺘﯜﺭﯛﻟﮕﻪﻥ ﮬﻪﺭ ﺑﯩﺮ ﺯﺍﻛﺎﺯ ﺋﻪﺯﺍﺳﻰ) (orderﺑﻮﻟﺴﺎ Orderﻧﺎﻣﻠﯩﻖ ﭼﺎﻗﯩﺮﯨﻠﻤﺎ)(引用
ﺗﯩﭙﻨﯩــﯔ ﺋﻮﺧــﺸﯩﻤﯩﻐﺎﻥ ﺋــﻮﺑﻴﯧﻜﯩﺘﻠﯩﺮﻯ .ﮔﻪﺭﭼﻪ ﺋﯩﻜﻜﯩﭽــﻰ ﺧﯧﺮﯨــﺪﺍﺭﻧﯩﯔ ﺋﯩﻜﻜﯩﻨﭽــﻰ ﺯﺍﻛــﺎﺯﻯ ﺑﯩــﻠﻪﻥ
ﺋــﯜﭼﯩﻨﭽﻰ ﺧﯧﺮﯨــﺪﺍﺭﻧﯩﯔ ﺑﯩﺮﯨﻨﭽــﻰ ﺯﺍﻛــﺎﺯﻯ ﺳــﺎﻥ -ﺳــﯩﻔﯩﺮ ﺟﻪﮬﻪﺗــﺘﯩﻦ ﺋﻮﺧــﺸﺎﺵ ﺑــﻮﻟﻐﯩﻨﻰ ﺑﯩــﻠﻪﻥ
ﺋﯘﻻﺭﻧﯩﯔ Hashﻛﻮﺩﻯ ﺋﻮﺧﺸﯩﻤﺎﻳﺪﯗ.
ﻧﻪﺗﯩﺠﯩﺪﻩ ﺋﯘﻻﺭﻧﻰ ﺳﯧﻠﯩـﺸﺘﯘﺭﻏﺎﻧﺪﺍ ﻳﻪﻧﯩـﻼ ﺋﻮﺧـﺸﯩﻤﯩﻐﺎﻥ ﺋﻮﺑﻴﯧﻜﯩـﺖ ﺑﻮﻟـﯘﭖ ﭼﯩﻘﯩـﭗ Distinctﻧﯩـﯔ
ﺗﻪﻛﺮﺍﺭﻻﺭﻧﻰ ﺳﯜﺯﯛﺵ ﺋﻪﮔﻠﯩﻜﯩﺪﯨﻦ)ﺋﻪﮔﻠﻪﻙ :ﺋﺎﺋﯩﻠﯩﻠﻪﺭﺩﻩ ﺋـﯘﻥ ﺗﺎﺳﻘﺎﺷـﻘﺎ ﺋﯩـﺸﻠﯩﺘﯩﻠﯩﺪﯨﻐﺎﻥ ﺳـﯜﺯﮔﯜﭺ(
ﺋﯚﺗﯜﭖ ﻛﯧﺘﯩﺪﯗ.
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 57
ﺩﯦﻤﻪﻙ ﻗﻮﺷﯘﻣﭽﻪ ﺳﺎﯞﺍﺕ 1ﺋﯧﻴﺘﯩﭗ ﺋﯚﺗﻜﻪﻥ ﺋﯘﺳﯘﻟﯩﻤﯩﺰ ﺑﻮﻳﯩﭽﻪ ﺯﺍﻛﺎﺯ) (Orderﺗﯩﭙﯩﻨﯩﯔ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﺵ
ﺧﯘﻟﻘﯩﻨﻰ ﺋﯚﺯﮔﻪﺭﺗﯩﺸﻜﻪ ﺗﻮﻏﺮﺍ ﻛﻪﻟﺪﻯ .ﺋﯘﺳﯘﻟﻰ ﻣﯘﻧﺪﺍﻕ:
public class Order {
public int Quantity;
public bool Shipped;
public string Month;
public int IdProduct;
)( ToStringﻣﯧﺘﻮﺩﯨﻨﻰ ﻗﺎﭘﻼﭖ ﻳﯧﺰﯨﺶ ﺋﺎﺭﻗﯩﻠﯩﻖ ،ﻣﻪﺯﻛﯘﺭ ﺗﯩﭙﻨﯩﯔ ﺋﯩﺴﯩﻤﯩﻐﺎ ﯞﻩﻛﯩﻠﻠﯩﻚ ﻗﯩﻠﯩﺪﯨﻐﺎﻥ //
ﮬﻪﺭﭖ-ﺑﻪﻟﮕﻪ ﺗﯩﺰﻣﯩﺴﯩﻨﯩﯔ ﻓﻮﺭﻣﺎﺗﯩﻨﻰ ﺋﯚﺯﮔﻪﺭﺗﻜﯩﻠﻰ ﺑﻮﻟﯩﺪﯗ//
public override string ToString() {
return String.Format("{0} ‐ {1} ‐ {2} ‐ {3}",
this.Quantity, this.Shipped, this.Month, this.IdProduct);
}
public override bool Equals(object obj) {
if (!(obj is Order))
return false;
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 58
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;
}
ﺷﯘﻧﯩﺴﻰ ﺋﯧﺴﯩﯖﯩﺰﺩﻩ ﺗﯘﺭﺳﯘﻥ C#3.0 ،ﺩﯨﻜﻰ ﺑﺎﺭﻟﯩﻖ ﻧﺎﻣﺴﯩﺰ ﺗﯩﭙﻼﺭ ﺑﯩﺮﺩﻩﻙ ﭼﺎﻗﯩﺮﯨﻠﻤﺎ ﺗﯩﭙﻘﺎ ﺗﻪﯞﻩ.
var expr1 = customers[1].Orders.Intersect(customers[2].Orders);
var expr2 = customers[1].Orders.Except(customers[2].Orders);
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);
ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ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ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 60
Sumﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ )ﻳﯩﻐﯩﻨﺪﺍ(
ﺑﯘ ﻣﻪﺷﻐﯘﻻﺗﭽﻰ ﺳﻪﻝ ﺋﺎﻻﮬﯩﺪﯨﺮﻩﻙ .ﺋﺎﯞﺍﻝ ﺋﯘﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﯨﻨﻰ ﻛﯚﺭﯛﭖ ﺋﯚﺗﻪﻳﻠﻰ:
public static Numeric Sum(
this IEnumerable<Numeric> source);
public static Numeric Sum<T>(
this IEnumerable<T> source,
;) Func<T, Numeric> selector
ﺋﯘﻧﯩــﯔ ﻗﺎﻳﺘﻤــﺎ ﻗﯩﻤﻤﯩﺘــﻰ ﻳــﺎﻛﻰ ﺋﯩﻜﻜﯩﻨﭽــﻰ ﺋﻪﻧﺪﯨﺰﯨــﺪﯨﻜﻰ ﭘــﺎﺭﺍﻣﯧﺘﯩﺮﻯ ﺑﻮﻟــﺴﯘﻥ ﺋﯘﻻﺭﻧﯩــﯔ ﺗﯩﭙــﻰ
Numericﺋﯩﻜﻪﻥ .ﺑﯘ ﻳﻪﺭﺩﯨﻜﻰ Numericﺑﻮﻟﺴﺎ »ﺳﺎﻧﻠﯩﻖ« ﺩﯦـﮕﻪﻥ ﻣﻪﻧﯩـﺪﻩ ﺑﻮﻟـﯘﭖint, int?, ،
? long, long?, float, float?, double, double?, decimal,decimalﻻﺭﻧﯩﯔ ﺧﺎﻟﯩﻐﺎﻥ ﺑﯩﺮﯨﻨـﻰ
ﻛﯚﺭﺳﯩﺘﯩﺪﯗ int .ﻏﯘ ﭘﯜﺗﯜﻥ ﺳﺎﻥ ﺗﯩﭙﻰ ،ﺋﻪﻣﯩﺴﻪ ? intﭼﯘ؟
C#2.0ﺩﯨــﻦ ﺗﺎﺭﺗﯩــﭗ ﻗﯩﻤﻤﻪﺗﻠﯩــﻚ ﺗﯩﭙﻠﯩــﻖ ﺋﯚﺯﮔﻪﺭﮔــﯜﭼﻰ ﻣﯩﻘــﺪﺍﺭﻻﺭﻏﺎ ﮬﯩــﭻ ﻗﺎﻧــﺪﺍﻕ ﻗﯩﻤــﻤﻪﺕ
ﻳﻮﻟﻼﻧﻤﺎﻳــﺪﯨﻐﺎﻥ ﮬــﺎﻟﻪﺗﻨﻰ ﺋﯩﭙــﺎﺩﯨﻠﻪﺵ ﺯﯙﺭﯛﺭﯨﻴﯩﺘﯩــﺪﯨﻦ)ﺑﻮﻟﯘﭘﻤــﯘ ﺳــﺎﻧﺪﺍﻧﺪﯨﻜﻰ ﻗــﯘﺭﯗﻕ intﺗﯩﭙﯩﻐــﺎ
ﻣﺎﺳﻼﺷﺘﯘﺭﯗﺵ( ﺷﯘ ﺗﯩﭗ ﺧﺎﺱ ﺳﯚﺯﯨﻨﯩﯔ ﺋﺎﺭﻗﯩـﺴﯩﻐﺎ ﺳـﯘﺋﺎﻝ ﺑﻪﻟﮕﯩـﺴﻰ ﺋـﺎﺭﻗﯩﻠﯩﻖ )? Tﺩﻩﻙ( ﻗـﯘﺭﯗﻕ
ﺑﻮﻻﻻﻳﺪﯨﻐﺎﻥ ﺗﯩﭗ ﮬﺎﻟﯩﺘﯩﻨﻰ ﺋﯩﭙﺎﺩﯨﻠﻪﻳﺪﯗ )ﺋﯘﻧﯩﯔ ﺗﯩﭙﻰ > .(Nullable<Tﻣﻪﺳـﯩﻠﻪﻥ ? intﺋـﺎﺭﻗﯩﻠﯩﻖ
> Nullable<System.Int32ﺋﯩﭙﺎﺩﯨﻠﯩﻨﯩـﺪﯗ int? i; i=null; Console.WriteLine(i).ﺩﻩﻙ ﻳﯧـﺰﯨﺶ
ﺑﯘ ﻗﯘﺭﻻﺭ ﺗﻪﻛﺸﯜﺭﯛﺷﺘﯩﻦ ﺋﯚﺗﻤﻪﻳﺪﯗ. ﻣﯘﺗﻠﻪﻕ ﺋﯩﻨﺎﯞﻩﺗﻠﯩﻚ .ﻟﯧﻜﯩﻦ ;)int i; Console.WriteLine(i
Sumﻧﯩﯔ ﺑﯩﺮﯨﻨﭽﻰ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﺪﻩ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭ ﺳـﺎﻧﻠﯩﻖ ﺗﯩﭙﻠﯩـﻖ ﺩﻩﭖ ﻗﺎﺭﯨﻠﯩـﭗ ﺋﯘﻻﺭﻏـﺎ
ﺑﯩﯟﺍﺳﺘﻪ ﻗﻮﺷﯘﺵ ﺋﻪﻣﯩﻠﻰ ﺑﯧﺠﯩﺮﯨﭗ ﻳﯩﻐﯩﻨﺪﯨﻨﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ .ﺋﻪﮔﻪﺭ ﻣﻪﻧﺒﻪ ﻗﯘﺭﯗﻕ ﺑﻮﻟﺴﺎ ﻧـﯚﻝ ﻗﺎﻳﺘﯩـﺪﯗ.
ﺋﻪﮔﻪﺭ ﺋﻪﺯﺍﻻﺭ nullﺑﻮﻻﻻﻳﺪﯨﻐﺎﻥ ﺗﯩﭙﻠﯩﻖ ﺑﻮﻟﯘﭖ ﮬﻪﻣﻤﯩﺴﯩﻨﯩﯔ ﻗﯩﻤﻤﯩﺘـﻰ nullﺑﻮﻟـﺴﺎ ﻧﻪﺗﯩﺠﯩـﺪﻩ null
ﻗﺎﻳﺘﯩﺪﯗ .ﻣﻪﺯﻛﯘﺭ ﺋﻪﻧﺪﯨﺰﻩ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭﻧﻰ ﺑﯩﯟﺍﺳﺘﻪ ﻗﻮﺷﻘﯩﻠﻰ ﺑﻮﻟﯩﺪﯨﻐﺎﻥ ﺋﻪﮬﯟﺍﻝ ﺋﺎﺳـﺘﯩﺪﺍ
ﺋﯩـــﺸﻠﯩﺘﯩﻠﯩﺪﯗ .ﻣﻪﺳـــﯩﻠﻪﻥ :ﻣﻪﻧـــﺒﻪ ﺗﯩﺰﻣـــﺎ ﺳـــﺎﻧﻼﺭ ﮔﯘﺭﭘﯩـــﺴﻰ ﺗﯩﭙﻠﯩـــﻖ ﺑﻮﻟـــﺴﺎ ،ﺗﯚﯞﻩﻧﺪﯨﻜﯩـــﺪﻩﻙ
ﺋﯩﺸﻠﯩﺘﻪﻟﻪﻳﻤﯩﺰ:
www.udmish.cn ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕLINQ 61
int[] values = { 1, 3, 9, 29 };
int total = values.Sum();
. ﺑﻮﻟﯩﺪﯗ1+3+9+29=42 ﻧﻪﺗﯩﺠﻪ
ﺋﻪﮔﻪﺭ ﺗﯩﺰﻣﺎ ﺑﯩﯟﺍﺳـﺘﻪ ﻗﻮﺷـﻘﯩﻠﻰ ﺑﻮﻟﯩـﺪﯨﻐﺎﻥ ﺳـﺎﻧﻠﯩﻖ ﺋﻪﺯﺍﻻﺭﺩﯨـﻦ ﺗﯜﺯﯛﻟﻤﯩـﺴﻪ) ﻣﻪﺳـﯩﻠﻪﻥ ﺧﯧﺮﯨـﺪﺍﺭﻻﺭ
ﻧﯩﯔ ﺋﯩﻜﻜﯩﻨﭽﻰ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﻨﻰ ﻗﻮﻟﻠﯩﻨﯩﭗ ﺋﻪﺯﺍﻧﯩﯔ ﻗﺎﻳﺴﻰ ﺧﺎﺳﻠﯩﻘﯩﻨﻰ ﻗﻮﺷﯘﺷـﻨﻰSum ،(ﺗﯩﺰﻣﯩﺴﺪﻩﻙ
: ﻣﻪﺳﯩﻠﻪﻥ.ﺑﻪﻟﮕﯩﻠﻪﭖ ﻗﻮﻳﯩﻤﯩﺰ
4.30 ﻛﻮﺩ
var customersOrders =
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 };
var expr =
from c in customers
join o in customersOrders
on c.Name equals o.Name
into customersWithOrders
select new { c.Name,
TotalAmount = customersWithOrders.Sum(o =>
o.OrderAmount) };
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) };
INNER JOIN orders AS o ON c.Name = o.Name
INNER JOIN products AS p ON o.IdProduct = p.IdProduct
GROUP BY c.Name
ﻛﻮﺩ 4.32
var expr =
(from c in customers
from o in c.Orders
select o.Quantity
).Min();
ﺋﯩﻜﻜﯩﻨﭽﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﯨﺪﻩ ﺋﻪﺯﺍﻻﺭﻧﯩـﯔ ﺗﯩﭙﯩﻨـﻰ ﺋﯧﺘﯩﯟﺍﺭﻏـﺎ ﺋﺎﻟﻤـﺎﻱ ﭼـﻮﯓ -ﻛﯩﭽﯩﻜﯩﻨـﻰ ﺗﺎﭘﯩـﺪﯗ.
)ﺋﻪﻟﯟﻩﺗﺘﻪ ،ﭼﻮﯓ -ﻛﯩﭽﯩﻜﯩﻨﻰ ﺗﯧﭙﯩﺶ ﺋﯜﭼﯜﻥ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﺵ ﺋﯧﻠﯩـﭗ ﺑﯧـﺮﯨﺶ ﻛﯧـﺮﻩﻙ( ﺋﻪﮔﻪﺭ ﻣﻪﻧـﺒﻪ
ﺗﯩﺰﻣﯩــﺪﯨﻜﻰ ﺋﻪﺯﺍ ﺗﯩﭙــﻰ > IComparable<Tﻧــﻰ )ﻳــﺎﻛﻰ IComparableﻧــﻰ( ﻗﻮﻟﻠﯩــﺴﺎ ﻣﯘﺷــﯘﻧﯩﯔ
ﺋﻪﻣﻪﻟﯩﻠﻪﺷﺘﯜﺭﯛﻟﯜﺷﻰ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺳﯧﻠﯩـﺸﺘﯘﺭﯗﺵ ﻗﯩﻠﯩـﺪﯗ .ﺋﻪﮔﻪﺭ ﻳـﯘﻗﯩﺮﯨﻘﻰ ﺋﯩﻜﻜﯩـﻼ ﺋﯧﻐﯩﺰﻧـﻰ ﺋﻪﻣﻪﻟـﮕﻪ
ﺋﺎﺷﯘﺭﻣﯩﻐﺎﻥ ﺑﻮﻟﺴﺎ ArgumentExceptionﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ)异常ﻧﻰ ﻣﯘﺷـﯘﻧﺪﺍﻕ ﺋﺎﺗـﺎﭖ ﺗـﯘﺭﺩﯗﻡ(
ﻗﻮﻳﯘﭖ ﺑﯧﺮﯨﺪﯗ .ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﺧﺎﺗﺎﻟﯩﻖ ﺋﯘﭼﯘﺭﯨﻨﯩﯔ ﺋﺎﺳﺎﺳﻰ ﻣﻪﺯﻣـﯘﻧﻰ ﻣﯘﻧـﺪﺍﻕ» :ﻛﻪﻡ ﺩﯦﮕﻪﻧـﺪﻩ ﺑﯩـﺮ
ﺩﺍﻧﻪ ﺋﻮﺑﻴﯧﻜﯩﺖ IComparableﺋﯧﻐﯩﺰﯨﻨﻰ ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﺎﻥ ﺑﻮﻟﯘﺷﻰ ﻛﯧﺮﻩﻙ«.
ﺩﻩﻟﯩﻠــﻰ ﺋﯜﭼــﯜﻥ ﻛــﻮﺩ 4.33ﺩﯨﻜﯩ ـﺪﻩﻙ ﻛــﻮﺩ ﻳﯧﺰﯨــﭗ ﻗﻪﺳــﺘﻪﻥ ﺑﯩﻨﻮﺭﻣــﺎﻟﻠﯩﻖ ﭼﯩﻘﯩﺮﯨﻠــﺪﻯ .ﻣﻪﺯﻛــﯘﺭ
ﻛﻮﺩﺩﯨﻜﻰ ﺧﺎﺗﺎﻟﯩﻖ ﺳﻪﯞﻩﺑﻰ ﺷﯘﻛﻰ ،ﮔﻪﺭﭼﻪ ﻧﻪﺗﯩﺠﻪ ﺗﯩﺰﻣﯩﺴﻰ ﺯﺍﻛـﺎﺯ ﻣﯩﻘـﺪﺍﺭﯨﻨﯩﯔ ﺗـﻮﭘﻠﯩﻤﻰ ﺑﻮﻟـﺴﯩﻤﯘ
ﻟﯧﻜﯩﻦ ﻛﻮﺩ 71ﺩﯨﻜﻰ ﺳﯜﺭﯛﺷﺘﯜﻛﺘﯩﻦ ﭘﻪﺭﻗﻠﯩﻨﯩﺪﯗ .ﻳﻪﻧـﻰ ﺋﺎﻟﺪﯨﻨﻘﯩـﺴﯩﺪﯨﻜﻰ ﭼـﺎﺭﻻﺵ ﻧﻪﺗﯩﺠﯩـﺴﯩﻨﯩﯔ
ﺗﯩﭙﻰ ﺳﺎﻧﻼﺭ ﮔﯘﺭﭘﯩﺴﻰ .ﻛﯧﻴﯩﻨﻜﯩﺴﯩﻨﯩﯩﯔ ﺑﻮﻟﺴﺎ ﺑﯩﺮﻻ ﺳﺎﻧﻠﯩﻖ ﻗﯩﻤﻤﻪﺗﻠﯩـﻚ ﺧﺎﺳـﻠﯩﻘﻰ ﺑﻮﻟﻐـﺎﻥ ﻧﺎﻣـﺴﯩﺰ
ﺗﯩﭙﻠﯩﻖ ﺋﻪﺯﺍﻻﺭ ﺗﻮﭘﻠﯩﻤﻰ .ﻧﺎﻣـﺴﯩﺰ ﺗﯩـﭙﻼﺭ ﺑﯩـﺮﺩﻩﻙ ﺳﯧﻠﯩـﺸﺘﯘﺭﯗﺵ ﺋﯧﻐﯩﺰﻟﯩﺮﯨﻨـﻰ ﺋﻪﻣﻪﻟـﮕﻪ ﺋﺎﺷـﯘﺭﻣﯩﻐﺎﻥ
ﺑﻮﻟﯩﺪﯗ.
ﻛﻮﺩ 4.33ﺯﻭﺭﻻﭖ ﺗﯩﭗ ﺧﺎﺗﺎﻟﯩﻘﻰ ﺳﻪﯞﻩﺑﻠﯩﻚ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﭼﯩﻘﯩﺮﯨﺶ
var expr =
(from c in customers
from o in c.Orders
select new { o.Quantity}
).Min();
ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺴﻰ ﻗﯘﺭﯗﻕ ﻳـﺎﻛﻰ ﺑـﺎﺭﻟﯩﻖ ﺋﻪﺯﺍﻻﺭﻧﯩـﯔ ﻗﯩﻤﻤﯩﺘـﻰ nullﺑﻮﻟـﯘﭖ ﻗﺎﻟﻐـﺎﻥ ﺋﻪﮬـﯟﺍﻝ ﺋﺎﺳـﺘﯩﺪﺍ،
ﺋﻪﮔﻪﺭ ﺋﻪﻧﺪﯨﺰﯨــﺪﯨﻜﻰ Numericﺗﯩﭙــﻰ ﻗــﯘﺭﯗﻕ ﺑﻮﻻﻻﻳــﺪﯨﻐﺎﻥ ﺗﯩــﭗ ﺑﻮﻟــﺴﺎ ،ﻧﻪﺗﯩــﺠﻪ nullﺑﻮﻟﯩــﺪﯗ.
ﺋﯘﻧﺪﺍﻕ ﺑﻮﻟﻤﺎﻳﺪﯨﻜﻪﻥ ArgumentNullException ،ﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﻗﻮﻳﯘﭖ ﺑﯧﺮﯨﻠﯩﺪﯗ .ﺋـﺎﺧﯩﺮﻗﻰ
ﺋﯩﻜﻜــﻰ ﺧﯩــﻞ ﺋﻪﻧﺰﯨــﺪﯨﻜﻰ ﺗــﺎﻟﻼﺵ ﻛﯚﺭﺳﻪﺗﻤﯩــﺴﻰ ﺋــﺎﺭﻗﯩﻠﯩﻖ ﺋﻪﺯﺍ ﺋﯩﭽﯩــﺪﯨﻜﻰ ﻗﺎﻳــﺴﻰ ﺧﺎﺳــﻠﯩﻘﻨﻰ
ﺳﯧﻠﯩــﺸﺘﯘﺭﯗﺷﻨﻰ ﺑﻪﻟﮕﯩــﻠﻪﭖ ﺑﯧﺮﯨــﭗ ﻳﯘﻗﯩﺮﯨﻘﯩــﺪﻩﻙ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻘﻨﯩــﯔ ﺋﺎﻟــﺪﯨﻨﻰ ﺋــﺎﻟﻐﯩﻠﯩﻤﯘ ﺑﻮﻟﯩــﺪﯗ.
ﻣﻪﺳﯩﻠﻪﻥ:
ﻛﻮﺩ 4.34ﻗﯩﻤﻤﻪﺕ ﺗﺎﻟﻠﯩﻐﯘﭺ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺧﯧﺮﯨﺪﺍﺭ ﺗﯩﭙﯩﻠﯩﺮﯨﻐﺎ ﻧﯩﺴﺒﻪﺗﻪﻥ Maxﻣﻪﺷﻐﯘﻻﺗﻰ ﺋﯧﻠﯩﭗ ﺑﯧﺮﯨﺶ
var expr =
(from c in customers
from o in c.Orders
select new { o.Quantity}
;)).Min(o => o.Quantity
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 65
Averageﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ
ﻣﻪﺯﻛﯘﺭ ﻣﻪﺷﻐﯘﻻﺗﭽﻰ ﺋﻪﺯﺍ ﻗﯩﻤﻤﻪﺗﻠﯩﺮﻧﯩﯔ ﺋﻮﺗﺘﯘﺭﭼﻪ ﻗﯩﻤﻤﯩﺘﯩﻨﻰ ﺗﺎﭘﯩﺪﯗ .ﺋﯘ ﺋﺎﻟﺪﯨﺪﺍ ﺳﯚﺯﻟﯩﮕﻪﻥ Max,
Min, Sumﻻﺭﻏــﺎ ﺋﻮﺧــﺸﺎﺵ ﺋﻪﺯﺍﻻﺭﻧﯩــﯔ ﻗﯩﻤﻤﻪﺗﻠﯩــﻚ ﺗﯩــﭗ ﺑﻮﻟﻐــﺎﻥ ﮬــﺎﻟﯩﺘﯩﮕﻪ ﻣﯘﯞﺍﭘﯩــﻖ .ﺋﯘﻧــﺪﺍﻕ
ﺑﻮﻟﻤﯩﻐــﺎﻥ ﺋﻪﮬــﯟﺍﻝ ﺋﺎﺳــﺘﯩﺪﺍ ﺑﺎﺷــﻘﺎ ﺋﻪﻧــﺪﯨﺰﯨﻠﯩﺮﻯ ﺋــﺎﺭﻗﯩﻠﯩﻖ ﻛــﯚﭖ ﺧﺎﺳــﻠﯩﻖ ﭼﺎﻗﯩﺮﯨﻠﻤــﺎ ﺗﯩﭙﻨﯩــﯔ
ﻗﯩﻤﻤﻪﺗﻠﯩﻚ ﺧﺎﺳﻠﯩﻘﯩﻨﻰ ﺑﻪﻟﮕﯩﻠﻪﭖ ﻗﻮﻳﯘﺵ ﻛﯧـﺮﻩﻙ .ﺷـﯘﻧﺪﯨﻼ ﻧﻮﺭﻣـﺎﻝ ﻣﻪﺷـﻐﯘﻻﺕ ﺋﯧﻠﯩـﭗ ﺑﺎﺭﺍﻻﻳـﺪﯗ.
ﺋﯘﻧﯩﯔ ﺗﯚﯞﻩﻧﺪﻩ ﻛﯚﺭﺳﯩﺘﯩﻠﮕﻪﻧﺪﻩﻙ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ ﺑﺎﺭ:
public static Result Average(
this IEnumerable<Numeric> source);
public static Result Average<T>(
this IEnumerable<T> source,
;) Func<T, Numeric> selector
ﺋﻮﺗﺘﯘﺭﭼﻪ ﻗﯩﻤﻤﯩﺘﻰ ﺋﯧﻠﯩﻨﻤﺎﻗﭽﻰ ﺑﻮﻟﻐﺎﻥ Numericﺗﯩﭗ int, int?, long, long?, float, float?,
double, double?, decimal, or decimal?.ﻻﺭﻧﯩﯔ ﺑﯩﺮﻯ ﺑﻮﻟﯘﺷﻰ ﻛﯧﺮﻩﻙ .ﺷﯘﻧﺪﺍﻕ ﺑﻮﻟﻐﺎﻧﺪﺍ
ﻧﻪﺗﯩﺠﻪ ﻣﻪﻧﺒﻪ ﺗﯩﭙﻘﺎ ﯞﺍﺭﯨﺴﻠﯩﻖ ﻗﯩﻠﯩﭙﻼ ﻗﺎﻟﻤﺎﻱ ،ﻗﯘﺭﯗﻕ ﺑﻮﻻﻻﻳﺪﯨﻐﺎﻥ ﺋﺎﻻﮬﯩﺪﯨﻠﯧﻜﯩﻨﯩﻤﯘ ﺳﺎﻗﻼﭖ ﻗﺎﻟﯩﺪﯗ.
ﺋﯘﻧﯩﯖﺪﯨﻦ ﺑﺎﺷﻘﺎ ،ﻣﻪﻧﺒﻪﺩﯨﻜﻰ ﺋﻪﺯﺍ intﻳﺎﻛﻰ longﺗﯩﭙﻠﯩﻖ ﺑﻮﻟﺴﺎ ،ﻧﻪﺗﯩﺠﻪ doubleﺗﯩﭙﻠﯩﻖ؛
ﻣﻪﻧﺒﻪﺩﯨﻜﻰ ﺋﻪﺯﺍ ? intﻳﺎﻛﻰ ? longﺗﯩﭙﻠﯩﻖ ﺑﻮﻟﺴﺎ ،ﻧﻪﺗﯩﺠﻪ ? doubleﺗﯩﭙﻠﯩﻖ ﺑﻮﻟﯩﺪﯗ.
ﺑﯘﻧﺪﺍﻕ ﺑﻮﻟﯩﺸﯩﻨﻰ ﭼﯜﺷﯜﻧﯜﺵ ﺗﻪﺱ ﺋﻪﻣﻪﺱ ،ﻳﻪﻧﻰ ،ﺑﯩﺮﻗﺎﻧﭽﻪ ﭘﯜﺗﯜﻥ ﺳﺎﻧﻨﯩﯔ ﺋﻮﺗﺘﯘﺭﯨﭽﻪ ﻗﯩﻤﻤﯩﺘﻰ
ﻛﻪﺳﯩﺮ ﺳﺎﻥ ﭼﯩﻘﯩﺸﻰ ﻣﯘﻣﻜﯩﻦ.
ﺗﯚﯞﻩﻧﺪﯨﻜﯩﺴﻰ ﺋﯩﻜﻜﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﮕﻪ ﺑﯩﺮﺩﯨﻦ ﻣﯩﺴﺎﻝ:
ﻛﻮﺩ Average 4.35ﻧﯩﯔ ﺋﯩﻜﻜﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﻰ ﻣﻪﮬﺴﯘﻻﺕ ﺑﺎﮬﺎﻟﯩﺮﯨﻐﺎ ﻣﻪﺷﻐﯘﻻﺕ ﺋﯧﻠﯩﭗ ﺑﺎﺭﯨﺪﯗ
var expr =
(from p in products
select p.Price
).Average();
var expr =
(from p in products
select new { p.Price }
).Average(p => p.Price);
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) };
Generationﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﻗﯘﺭﻏﯘﭺ(
ﻣﻪﺳﯩﻠﻪﻥ -2000ﻳﯩﻠﯩﺪﯨﻦ -2007ﻳﯩﻠﯩﮕﯩﭽﻪ ﺑﻮﻟﻐـﺎﻥ ﺋـﺎﺭﻟﯩﻘﺘﯩﻜﻰ ﺯﺍﻛـﺎﺯﻻﺭ ﺗﯩﺰﯨﻤﻠﯧﻜﯩﻨـﻰ ﭼﯩﻘﯩـﺮﯨﺶ،
ﻳﺎﻛﻰ ﺋﻮﺧﺸﺎﺵ ﺑﯩﺮ ﺋﯘﭼﯘﺭﻏﺎ ﺋﻮﺧـﺸﺎﺵ ﺑﯩـﺮ ﻣﻪﺷـﻐﯘﻻﺗﻨﻰ ﺗﻪﻛـﺮﺍﺭ ﺋﯧﻠﯩـﭗ ﺑﯧﺮﯨـﺸﺘﻪﻙ ﻣﻪﺷـﻐﯘﻻﺗﻼﺭﻧﻰ
ﻗﯘﺭﻏﯘﭺ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺋﯩﻨﺘﺎﻳﯩﻦ ﺋﻪﭘﭽﯩﻠﻠﯩﻚ ﺑﯩﻠﻪﻥ ﺋﯧﻠﯩﭗ ﺑﺎﺭﺍﻻﻳﺪﯗ.
var expr =
Enumerable.Range(2005, 3)
.SelectMany(x => (from o in orders
where o.Year == x
select new { o.Year, o.Amount }));
static int Factorial(int number) {
return (Enumerable.Range(0, number + 1)
.Aggregate(0, (s, t) => t == 0 ? 1 : s *= t)); }
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 68
var expr =
Enumerable.Repeat( (from c in customers
select c.Name), 3)
;).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ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 69
IEnumerable<Customer> customers = Enumerable.Empty<Customer>();
Anyﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ
ﺗﻮﻧﯘﺷﺘﯘﺭﻣﺎﻗﭽﻰ ﺑﻮﻟﻐﺎﻥ ﺗـﯘﻧﺠﻰ ﻣﻪﺷـﻐﯘﻻﺗﭽﻰ Anyﺑﻮﻟـﯘﭖ ،ﺋـﯘ ﺑﯧـﺮﯨﻠﮕﻪﻥ ﺭﺍﺱ -ﻳﺎﻟﻐـﺎﻥ ﺗﯩﭙﻠﯩـﻖ
ﻛﯚﺭﺳﻪﺗﻤﯩﮕﻪ ﺋﺎﺳﺎﺳﻪﻥ ﺭﺍﺱ -ﻳﺎﻟﻐﺎﻧﻠﯩﻖ ﻗﯩﻤﻤﻪﺕ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ .ﺗﯚﯞﻩﻧﺪﯨﻜﯩﻠﻪﺭ ﺋﯘﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ:
public static bool Any<T>(
this IEnumerable<T> source,
Func<T, bool> predicate);
public static bool Any<T>(
;) this IEnumerable<T> source
ﻛﻮﺩ 4.44
bool result =
(from c in customers
from o in c.Orders
select o)
.Any(o => o.IdProduct == 1);
ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻗﯘﺭﺩﺍ ﻧﻪﺗﯩﺠﯩﻨﻰ ﻗﻪﺳﺘﻪﻥ ﻳﺎﻟﻐﺎﻥ ﭼﯩﻘﺎﺭﺩﯗﻕ ،ﭼﯜﻧﻜﻰ ﺗﯩﺰﻣﺎ ﻗﯘﺭﯗﻕ//
result = Enumerable.Empty<Order>().Any(o => o.IdProduct == 1);//false
ﻣﻪﺳﯩﻠﻪﻥ :ﮬﻪﺭﺑﯩﺮ ﺯﺍﻛﺎﺯ ﻣﯩﻘﺪﺍﺭﯨﻨﯩﯔ ﻣﯘﺳﺒﻪﺕ ﺳـﺎﻥ ﺑﻮﻟـﯘﺵ ﺷـﻪﺭﺗﯩﻨﻰ ﻗﺎﻧﻪﺋﻪﺗﻠﻪﻧﺪﯛﺭﯨـﺪﯨﻐﺎﻥ ﻳـﺎﻛﻰ
ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﺪﯛﺭﻣﻪﻳﺪﯨﻐﺎﻧﻠﯩﻘﯩﻨﻰ ﺗﻪﻛﺸﯜﺭﯛﭖ ﺑﺎﻗﯩﻠﻰ:
ﻛﻮﺩ 4.45
bool result =
(from c in customers
from o in c.Orders
select o)
.All(o => o.Quantity > 0);
result = Enumerable.Empty<Order>().All(o => o.Quantity > 0);
//false
public static bool Contains<T>(
this IEnumerable<T> source,
T value);
public static bool Contains<T>(
this IEnumerable<T> source,
T value,
) IEqualityComparer<T> comparer
ﺋﻪﮔﻪﺭ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭ > ICollection<Tﺋﯧﻐﯩﺰﯨﻨﻰ ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﻏﺎﻥ ﺑﻮﻟـﺴﺎ Linq ،ﺋﺎﻣـﺎﻝ
ﺑﺎﺭ ﺋﯘﺷﺒﯘ ﺋﯧﻐﯩﺰﻧﻰ ﺋﯩﺸﻠﯩﺘﯩﺪﯗ .ﭼﯜﻧﻜﻰ ﺑﯘﻧﺪﺍﻕ ﺑﻮﻟﻐﺎﻧﺪﺍ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﺵ ﺑﯩﺮﻗﻪﺩﻩﺭ ﺗﯧﺰ ﺑﻮﻟﯩﺪﯗ.
ﺋﻪﮔﻪﺭ ﺋﻪﻣﻪﻟــﮕﻪ ﺋﺎﺷــﯘﺭﻣﯩﻐﺎﻥ ﺑﻮﻟــﺴﺎ ،ﻧﯩــﺸﺎﻥ ﺋﻪﺯﺍ ﺑﯩــﻠﻪﻥ ﻣﻪﻧــﺒﻪ ﺗﯩﺰﻣﯩــﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭ ﺑﯩﺮﻣــﯘ -ﺑﯩــﺮ
ﺳﯧﻠﯩــﺸﺘﯘﺭﯨﻠﯩﺪﯗ .ﺋﻪﮔﻪﺭ ﺋﯩﻜﻜﯩﻨﭽــﻰ ﺋﻪﻧــﺪﯨﺰﻩ ﺑــﻮﻳﯩﭽﻪ ﺷﻪﺧــﺴﻰ ﺳﯧﻠﯩــﺸﺘﯘﺭﻏﯘﭼﻨﻰ ﻳــﻮﻟﻼﭖ ﺑﻪﺭﺳــﻪ،
ﺷﯘﻧﻰ ﺋﯩﺸﻠﯩﺘﯩﺪﯗ .ﺋﯘﻧـﺪﺍﻕ ﺑﻮﻟﻤﯩـﺴﺎ ﻛﯚﯕﯜﻟـﺪﯨﻜﻰ ﻗﯩﻤـﻤﻪﺕ ﺑـﻮﻳﯩﭽﻪ EqualityComparer<T>.ﻧـﻰ
ﺋﯩﺸﻠﯩﺘﯩﺪﯗ.
ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻣﯩﺴﺎﻟﺪﺍ ﺗـﯘﻧﺠﻰ ﺧﯧﺮﯨـﺪﺍﺭﻧﯩﯔ ﺯﺍﻛـﺎﺯﻟﯩﺮﻯ ﺋﯩﭽﯩـﺪﻩ ﺑﯧـﺮﯨﻠﮕﻪﻥ ﺯﺍﻛﺎﺯﻧﯩـﯔ ﺑـﺎﺭ -ﻳـﻮﻗﻠﯩﻘﻰ
ﺗﻪﻛﺸﯜﺭﯛﻟﺪﻯ:
orderOfProductOne = new Order {Quantity = 3, IdProduct = 1 ,
Shipped = false, Month = "January"};
bool result = customers[0].Orders.Contains(orderOfProductOne);
Partitioningﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ )ﭘﺎﺭﭼﯩﻼﺵ(
ﺑﻪﺯﯨﺪﻩ ﺗﯩﺰﻣﯩﻨﯩﯔ ﻣﻪﻟﯘﻡ ﺑﯚﻟﯩﻜﯩﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭﻏﺎ ﻧﯩﺴﺒﻪﺗﻪﻧﻼ ﻣﻪﺷﻐﯘﻻﺕ ﺋﯧﻠﯩﭗ ﺑﯧـﺮﯨﺶ ﺗـﻮﻏﺮﺍ ﻛﯧﻠﯩـﺪﯗ.
ﻣﻪﺳـــﯩﻠﻪﻥ :ﺧﯧﺮﯨـــﺪﺍﺭﻻﺭ ﺗﯩﺰﻣﯩـــﺴﯩﺪﯨﻜﻰ ﺋﺎﻟـــﺪﯨﻨﻘﻰ Nﻧﻪﭘﻪﺭ ﺧﯧﺮﯨـــﺪﺍﺭﻧﯩﯔ ﺋﯘﭼﯘﺭﯨﻐـــﺎ ﺋﯧﺮﯨـــﺸﯩﺶ
ﺩﯦﮕﻪﻧﺪﻩﻙ .ﺋﻪﻟﯟﻩﺗﺘﻪ ﺑﯘﻧﺪﺍﻕ ﻣﻪﺳﯩﻠﯩﻠﻪﺭﻧﻰ Whereﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﺑﯩـﻠﻪﻥ Selectﻣﻪﺷﻐﯘﻻﺗﭽﯩـﺴﯩﻐﺎ
ﻧﯚﻟﺪﯨﻦ ﺑﺎﺷﻠﯩﻨﯩﺪﯨﻐﺎﻥ ﺗﻪﺭﺗﯩﭗ ﻧﻮﻣـﯘﺭﯨﻨﻰ ﻛﯚﺭﺳـﻪﺗﻜﯜﭼﻨﯩﯔ ﭘـﺎﺭﺍﻣﯧﺘﯩﺮﻯ ﻗﯩﻠﯩـﭗ ﺑﯧـﺮﯨﺶ ﺋـﺎﺭﻗﯩﻠﯩﻘﻤﯘ
ﮬﻪﻝ ﻗﯩﻼﻻﻳﻤﯩﺰ .ﻟﯧﻜﯩﻦ ﺋﯘﻧﯩﯔ ﺩﺍﺋﯩﻢ ﻗﻮﻻﻳﻠﯩﻖ ،ﺑﯩﯟﺍﺳﺘﻪ ﻳﻮﻝ ﺑﻮﻟﯘﺷﻰ ﻧﺎﺗـﺎﻳﯩﻦ .ﺷـﯘﯕﺎ Linqﺩﯨﻜـﻰ
ﻣﯘﺷﯘﻧﺪﺍﻕ ﻣﻪﺳﯩﻠﯩﻠﻪﺭﮔﻪ ﺧﺎﺱ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻼﺭﻧﻰ ﺋﯩﺸﻠﯩﺘﯩﺶ ﻳﺎﺧﺸﻰ ﺗﺎﻟﻼﺵ.
ﺑﯘ ﺗﯜﺭﺩﯨﻜﻰ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻼﺭ ﺋﺎﺭﯨـﺴﺪﯨﻜﻰ Takeﺑﯩـﻠﻪﻥ TakeWhileﺑﻮﻟـﺴﺎ ﺋـﯚﺯ ﻳﻮﻟﻠﯩﺮﯨـﺪﺍ ﺋـﺎﻳﺮﯨﻢ-
ﺋﺎﻳﺮﯨﻢ ﮬﺎﻟﺪﺍ ﺋﺎﻟﺪﯨﻨﻘﻰ Nﺩﺍﻧﻪ ﺋﻪﺯﺍ ﻳﺎﻛﻰ ﺑﯧﺮﯨﻠﮕﻪﻥ ﺷـﻪﺭﺗﻨﻰ ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧـﺪﯛﺭﮔﯩﭽﻪ ﺋﺎﻟـﺪﯨﻨﻘﻰ ﻣـﺎﻧﭽﻪ
ﺋﻪﺯﺍﻧﻰ ﺋﺎﻟﯩﺪﯗ.
Skipﯞﻩ SkipWhileﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ Takeﺑﯩﻠﻪﻥ TakeWhileﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﯩﯔ ﺗﻮﻟﯘﻗﻠﯩﻤﯩﺴﻰ
ﺑﻮﻟﯘﭖ ،ﺋﺎﻟﺪﯨﻨﻘﻰ Nﺋﻪﺯﺍﻧﻰ ﻳﺎﻛﻰ ﺑﯧﺮﯨﻠﮕﻪﻥ ﺷﻪﺭﺗﻨﻰ ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﺪﯛﺭﯨﺪﯨﻐﺎﻥ ﺋﺎﻟﺪﯨﻨﻘﻰ ﻣﺎﻧﭽﻪ ﺋﻪﺯﺍﻧﻰ
ﺋﺎﺗﻼﭖ ﺋﯚﺗﯜﭖ ﻛﯧﺘﯩﺪﯗ.
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 72
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 }
).Take(2);
ﻛﯚﺭﮔﻪﻧﺴﯩﺰ! ﮔﻪﺭﭼﻪ ﺋﻮﻣﯘﻣﻰ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﻰ ﺋﯩﻨﺘﺎﻳﯩﻦ ﭼﯩﺮﻣﺎﺵ ﺑﻮﻟﻐﺎﻥ ﺑﯩﻠﻪﻥ Take ،ﻧﻰ
ﺋﻮﺭﯗﻧﻼﺷﺘﯘﺭﯗﺵ ﻧﺎﮬﺎﻳﯩﺘﻰ ﺋﺎﺩﺩﯨﻲ .ﻳﯘﻗﯩﺮﯨﻘﻰ ﺋﯩﭙﺎﺩﯨﺪﻩ ﺑﯘﺭﯗﻥ ﺳﯚﺯﻟﯩﮕﻪﻥ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺧﺎﺱ
ﺳﯚﺯﻟﯩﺮﯨﻨﻰ ﺋﯩﺸﻠﯩﺘﯩﺶ ﺑﯩﻠﻪﻥ ﺑﯩﺮ ﯞﺍﻗﯩﺘﺘﺎ ﻳﯧﯖﻰ ﺧﺎﺱ ﺳﯚﺯ letﻣﯘ ﺋﯩﺸﻠﯩﺘﯩﻠﺪﻯ let .ﺧﺎﺱ ﺳﯚﺯﻯ ﺋﯩﭙﺎﺩﻩ
ﺋﯩﭽﯩﺪﻩ ﻣﻪﻟﯘﻡ ﮬﻪﺭﭖ-ﺑﻪﻟﮕﻪ ﺗﯩﻤﯩﺴﯩﻨﻰ ﻣﻪﻟﯘﻡ ﻗﯩﻤﻤﻪﺗﻜﻪ ﻳﺎﻛﻰ ﻣﻪﻟﯘﻡ ﻓﻮﺭﻣﯩﻼ ﻗﯩﻤﻤﯩﺘﯩﮕﻪ ﺗﻪﯕﺪﺍﺵ ﻗﯩﻠﯩﺶ
ﺭﻭﻟﯩﻨﻰ ﺋﻮﻳﻨﺎﻳﺪﯗ .ﺯﺍﻏﺮﺍ ﺗﯩﻞ ﺑﻮﻳﯩﭽﻪ ﺋﯩﭙﺎﺩﻩ ﺋﯩﭽﯩﺪﻩ ﻳﻪﺭﻟﯩﻚ ﺋﯚﺯﮔﻪﺭﮔﯜﭼﻰ ﻣﯩﻘﺪﺍﺭ ﺋﯧﻨﯩﻘﻼﻳﺪﯗ ﺩﯦﺴﻪﻛﻤﯘ
( .ﻣﻪﺳﯩﻠﻪﻥ :ﻳﯘﻗﯩﺮﯨﻘﻰ ﻣﯩﺴﺎﻟﯩﻤﯩﺰﺩﺍ ﺯﺍﻛﺎﺯﻯ ﺑﺎﺭ ﺧﯧﺮﯨﺪﺍﺭﻧﯩﯔ ﺑﻮﻟﯩﺪﯗ)ﺑﯘ ﺯﺍﻏﺮﺍ ﺗﯩﻞ ﺋﻪﻣﻪﺳﻤﯘ ﻳﺎ...
ﺑﯩﺮﯨﻨﭽﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﺪﻩ ،ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﻨﯩﯔ ﻧﯚﻟﯩﻨﭽﻰ ﺋﻪﺯﺍﺳﯩﺪﯨﻦ ﺑﺎﺷﻼﭖ ﭼﺎﺭﻻﺵ ﺋﯧﻠﯩـﭗ ﺋﯘﻧﯩـﯔ
ﻛﯚﺭﺳـــــﻪﺗﻜﯜﭼﺘﯩﻜﻰ ﺷـــــﻪﺭﺗﻜﻪ ﭼﯜﺷـــــﯩﺪﯨﻐﺎﻧﻴﺎﻛﻰ ﭼﯜﺷـــــﻤﻪﻳﺪﯨﻐﻨﺎﻟﯩﻘﯩﻨﻰ ﺗﻪﻛـــــﺸﯜﺭﯨﺪﯗ ،ﺋﻪﮔﻪﺭ
ﭼﯜﺷﺴﻪ)ﻛﯚﺭﺳﻪﺗﻤﻪ ﻗﯩﻤﻤﯩﺘﻰ ﺭﺍﺳﺖ ﺑﻮﻟـﺴﺎ( ﺋـﯘﻧﻰ ﺋـﯘ ﻧﻪﺗﯩـﺠﻪ ﺗﻮﭘﻠﯩﻤﯩﻐـﺎ ﻗﻮﺷـﯘﭖ ﺑﻮﻟـﯘﭖ ﻛﯧﻴﯩﻨﻜـﻰ
ﺋﻪﺯﺍﻧﻰ ﺋﻮﺧﺸﺎﺵ ﺋﯘﺳﯘﻟﺪﺍ ﺗﻪﻛﺸﯜﺭﯨﺪﯗ .ﺑﯘ ﺟﻪﺭﻳـﺎﻥ ﺗـﺎﻛﻰ ﻣﻪﻟـﯘﻡ ﺋﻪﺯﺍ ﺷـﻪﺭﺗﻜﻪ ﭼﯜﺷـﻤﯩﮕﻪﻧﮕﻪ ﻳـﺎﻛﻰ
ﺋﻪﯓ ﺋﺎﺧﯩﺮﯨﻘﻰ ﺋﻪﺯﺍﻧﻰ ﺗﻪﻛﺸﯜﺭﯛﺵ ﺗﺎﻣﺎﻣﻼﻧﻐﺎﻧﻐﺎ ﻗﻪﺩﻩﺭ ﺩﺍﯞﺍﻣﻠﯩﺸﯩﺪﯗ.
ﺋﯩﻜﻜﯩﻨﭽﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﺪﻩ ﭘﺎﺭﺍﻣﯧﺘﯩﺮ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺑﯩـﺮﺩﺍﻧﻪ ﭘﯜﺗـﯜﻥ ﺳـﺎﻥ ﻳـﻮﻟﻼﭖ ﺑﯧﺮﯨﻤﯩـﺰ ،ﭼـﺎﺭﻻﺵ
ﻣﻪﺷﻐﯘﻻﺗﻰ ﺋﯘﺷﺒﯘ ﺳﺎﻥ ﺗﻪﺭﺗﯩﭙﻠﯩﻚ ﺋﻪﺯﺍﺩﯨﻦ ﺑﺎﺷﻠﯩﻨﯩﺪﯗ.
ﺋﯘﻧﯩﯖﺪﯨﻦ ﺑﺎﺷﻘﺎ ﺷﻪﺭﺕ ﻛﯚﺭﺳﻪﺗﻤﯩﺴﯩﻨﻰ ﻣﯘﯞﺍﭘﯩﻖ ﺗﯜﺯﯛﺵ ﺋﺎﺭﻗﯩﻠﯩﻖ ﺗﯧﺨﯩﻤﯘ ﻣـﯘﺭﻩﻛﻜﻪﭖ ﻣﻪﺳـﯩﻠﯩﻠﻪﺭﻧﻰ
ﮬﻪﻝ ﻗﯩﻼﻻﻳﻤﯩﺰ .ﻣﻪﺳﯩﻠﻪﻥ :ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻣﯩﺴﺎﻟﺪﺍ ﺯﺍﻛﺎﺯ ﻣﯩﻘـﺪﺍﺭﻯ ﻗﯩﻤﻤﯩﺘـﻰ ﺋﻮﻣـﯘﻣﻰ ﻗﯩﻤﻤﻪﺗﻨﯩـﯔ %80
ﺗﯩﻨﻰ ﺋﯩﮕﯩﻠﻪﻳﺪﯨﻐﺎﻥ ﺋﺎﻟﺪﯨﻨﻘﻰ ﺧﯧﯩﺮﺩﺍﺭﻻﺭﻏﺎ ﺋﯧﺮﯨﺸﯩﺪﯗ:
ﻛﻮﺩ 4.48
//
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<T> Skip<T>(
this IEnumerable<T> source,
int count);
public static IEnumerable<T> SkipWhile<T>(
this IEnumerable<T> source,
Func<T, bool> predicate);
public static IEnumerable<T> SkipWhile<T>(
this IEnumerable<T> source,
Func<T, int, bool> predicate);
ﺋﯧﻠﯧﻤﯧﻨﺖ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ
ﺋﯧﻠﯧﻤﯧﻨــﺖ ﻣﻪﺷــﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺗﯩﺰﻣــﺎ ﺋﯩﭽﯩــﺪﯨﻜﻰ ﻣﻪﻟــﯘﻡ ﺑﯩــﺮﻻ ﺋﻪﺯﺍﻏــﺎ ﺋﺎﻻﻗﯩﻠــﺪﺍﺭ ﻣﻪﺷــﻐﯘﻻﺗﻨﻰ ﺋﯧﻠﯩــﭗ
ﺑﺎﺭﯨــﺪﯨﻐﺎﻥ ﺑﻮﻟــﯘﭖ ،ﻣﻪﻟــﯘﻡ ﺋﻮﺭﯗﻧــﺪﯨﻜﻰ ﻳــﺎﻛﻰ ﺷــﻪﺭﺗﻜﻪ ﺋﯘﻳﻐــﯘﻥ ﺑﯩــﺮﻻ ﺋﻪﺯﺍﻧــﻰ ﻗﺎﻳﺘﯘﺭﯨــﺪﯗ .ﺋﻪﮔﻪﺭ
ﺗﺎﭘﺎﻟﻤﯩﺴﺎ ﻛﯚﯕﯜﻟﺪﯨﻜﻰ ﻗﯩﻤﻤﻪﺕ ﺋﻪﺯﺍﺳﯩﻨﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ.
ﺑﯩﺮﯨﻨﭽﻰ ﺧﯩﻞ ﺋﻪﻧﺪﯨﺰﯨﺴﯩﺪﻩ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﻨﯩﯔ ﺑﯩﺮﯨﻨﭽﻰ ﺋﯧﻠﯧﻤﯧﻨﺘﯩﻨﻰ ﻗﺎﻳﺘﯘﺭﯨـﺪﯗ .ﺋﯩﻜﻜﯩﻨﭽـﻰ ﺧﯩﻠﯩـﺪﺍ
ﺑﯧــﺮﯨﻠﮕﻪﻥ ﺷــﻪﺭﺗﻜﻪ ﭼﯜﺷــﯩﺪﯨﻐﺎﻥ ﺗــﯘﻧﺠﻰ ﺋﯧﻠﯧﻤﯧﻨﺘﻨــﻰ ﻗﺎﻳﺘﯘﺭﯨــﺪﯗ .ﺋﻪﮔﻪﺭ ﺷــﻪﺭﺗﻜﻪ ﭼﯜﺷــﯩﺪﯨﻐﺎﻥ
ﺋﯧﻠﯧﻤﯧﻨﺖ ﺗﯧﭙﯩﻠﻤﯩﺴﺎ ﻳﺎﻛﻰ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﺎ ﻗـﯘﺭﯗﻕ ﺑﻮﻟـﺴﺎ ،ﻣﻪﺷـﻐﯘﻻﺗﭽﻰ InvalidOperationException
ﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﻗﻮﻳﯘﭖ ﺑﯧﺮﯨﺪﯗ .ﺗﯚﯞﻩﻧﺪﻩ ﺑﯩﺮﻣﯩﺴﺎﻝ:
ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻜﻰ USAﺑﻮﻟﻐﺎﻥ ﺗﯘﻧﺠﻰ ﺧﯧﺮﯨﺪﺍﺭﻏﺎ ﺋﯧﺮﯨﺸﯩﺶ ﻛﻮﺩ 4.49
var item = customers.First(c => c.Country == Countries.USA);
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<Customer> emptyCustomers =
Enumerable.Empty<Customer>();
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<T>(
this IEnumerable<T> source);
public static T Last<T>(
this IEnumerable<T> source,
Func<T, bool> predicate);
public static T LastOrDefault<T>(
this IEnumerable<T> source);
public static T LastOrDefault<T>(
this IEnumerable<T> source,
Func<T, bool> predicate);
Single
ﺗﯩﺰﻣﯩﻼﺭﻧﯩـﯔ ﯞﻩﻛﯩﻠـﻰ ﺳـﯜﭘﯩﺘﯩﺪﻩ( ﺋﺎﻟﻤـﺎﻗﭽﻰ:ﺋﻪﮔﻪﺭ ﺗﯩﺰﻣﯩﺪﯨﻦ ﺑﯩﺮﺗﺎﻝ ﺋﻪﺯﺍﻧﻰ ﺷـﯘﻧﺪﺍﻗﻼ )ﻣﻪﺳـﯩﻠﻪﻥ
: ﺋﯘﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ. ﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﻰ ﺋﯩﺸﻠﯩﺘﯩﯔSingle ﺑﻮﻟﺴﯩﯖﯩﺰ
public static T Single<T>(
this IEnumerable<T> source);
public static T Single<T>(
this IEnumerable<T> source,
Func<T, bool> predicate);
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 77
ﺋﻪﮔﻪﺭ ﻛﯚﺭﺳﻪﺗﻜﯜﭺ ﺷﻪﺭﺗﻰ ﺑﯧﺮﯨﻠﻤﯩﺴﻪ ،ﻗﺎﻳﺘﯩﺪﯨﻐﯩﻨﻰ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﺑﯩﺮﯨﻨﭽﻰ ﺋﯧﻠﯧﻤﯧﻨﺖ ﺑﻮﻟﯩﺪﯗ .ﺋﯘﻧﺪﺍﻕ
ﺑﻮﻟﻤﯩﻐﺎﻧﺪﺍ ﺷﻪﺭﺗﻜﻪ ﭼﯜﺷﯩﺪﯨﻐﺎﻥ ﺑﯩﺮﺗﺎﻝ ﺋﯧﻠﯧﻤﯧﻨﺖ ﺑﻮﻟﯩﺪﯗ .ﺋﻪﮔﻪﺭ ﻛﯚﺭﺳﻪﺗﻜﯜﭺ ﺑﻮﻟﻤﯩﺴﺎ ﮬﻪﻣﺪﻩ ﺗﯩﺰﻣﯩﺪﺍ
ﺑﯩﺮﺩﯨﻦ ﺋﺎﺭﺗﯘﻕ ﺋﯧﻠﯧﻤﻨﺖ ﺑﻮﻟﺴﺎ InvalidOperationExceptionﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﻗﻮﻳﯘﭖ ﺑﯧﺮﯨﻠﯩﺪﯗ.
ﺋﻪﮔﻪﺭ ﻛﯚﺭﺳﻪﺗﻜﯜﭺ ﺑﯧﺮﯨﻠﺴﻪ ﻟﯧﻜﯩﻦ ﺗﯩﺰﻣﯩﺪﺍ ﺷﻪﺭﺗﻜﻪ ﭼﯜﺷﯩﺪﯨﻐﺎﻥ ﺑﯩﺮﻣﯘ ﺋﯧﻠﯧﻤﯧﻨﺖ ﺑﻮﻟﻤﯩﺴﺎ ﻳﺎﻛﻰ ﺗﯩﺰﻣﺎ
ﻗﯘﺭﯗﻕ ﺑﻮﻟﺴﺎ InvalidOperationExceptionﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﭼﯩﻘﯩﺮﯨﺪﯗ .ﺗﯚﯞﻩﻧﺪﯨﻜﯩﻠﻪﺭ
ﺋﻮﺧﺸﯩﻤﯩﻐﺎﻥ ﺋﻪﮬﯟﺍﻟﻼﺭﻏﺎ ﻣﺎﺱ ﻣﯩﺴﺎﻟﻼﺭ:
ﻛﻮﺩ 4.51
var item = products.Single(p => p.IdProduct == 1);
Console.WriteLine(item == null ? "null" : item.ToString());
InvalidOperationExceptionﭘﯧﺸﻜﯩﻠﻰ ﭼﯩﻘﯩﺮﯨﺪﯗ//
item = products.Single();
Console.WriteLine(item == null ? "null" : item.ToString());
InvalidOperationExceptionﭘﯧﺸﻜﯩﻠﻰ ﭼﯩﻘﯩﺮﯨﺪﯗ//
IEnumerable<Product> emptyProducts = Enumerable.Empty<Product>();
item = emptyProducts.Single(p => p.IdProduct == 1);
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<T>(
this IEnumerable<T> source,
int index);
public static T ElementAtOrDefault<T>(
this IEnumerable<T> source,
int index);
// ﻧﻰ ﻗﺎﻳﺘﯘﺭﯨﺪﯗProduct 2
var item = products.ElementAt(2);
Console.WriteLine(item == null ? "null" : item.ToString());
// ﻗﺎﻳﺘﯘﺭﯨﺪﯗ null
item = Enumerable.Empty<Product>().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<T> DefaultIfEmpty<T>(
this IEnumerable<T> source);
public static IEnumerable<T> DefaultIfEmpty<T>(
this IEnumerable<T> source,
T defaultValue);
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 79
ﺑﻪﻟﮕﯩﻠﯩﻤﯩﺴﻰ ﺑﻮﻳﯩﭽﻪ ،ﺋﯘ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭ ﺗـﻮﭘﯩﻨﻰ ﻗﺎﻳﺘﯘﺭﯨـﺪﯗ .ﺋﻪﮔﻪﺭ ﻣﻪﻧـﺒﻪ ﺗﯩﺰﻣـﺎ ﻗـﯘﺭﯗﻕ
ﺑﻮﻟﺴﺎ ،ﺑﯩﺮﯨﻨﭽﻰ ﺋﻪﻧﺪﯨﺰﯨﺪﻩ ) 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<Order>(Enumerable.Empty<Order>())).ToArray();
return(empty);
}
}
ﺑﻪﺯﯨﺪﻩ ﺑﯘﻧـﺪﺍﻕ ﻗﯩﻠﯩـﺶ ﻳﺎﺧـﺸﻰ ﺋﯩـﺶ ،ﺑﻮﻟﯘﭘﻤـﯘ ﺑـﯚﻟﻪﻙ ﺳـﯩﻨﯩﻘﻰ ﺋﯧﻠﯩـﭗ ﺑﺎﺭﻏﺎﻧـﺪﺍ ﺋﯩﻨﺘـﺎﻳﯩﻦ ﺋﻪﺱ
ﻗﺎﺗﯩﺪﯗ .ﺋﯘﻧﯩﯖﺪﯨﻦ ﺑﺎﺷﻘﺎ ،ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ GroupJoinﻧـﻰ ﺋﯩـﺸﻠﯩﺘﯩﭗ ﺳـﻮﻝ -ﺳـﯩﺮﺗﻘﻰ ﮬﻪﻣـﺪﻩﻣﯩﻨﻰ
ﺑﺎﻳﻘﯩﻐﺎﻧﺪﺍ Null ،ﺑﻮﻟﯘﺵ ﺋﯧﮫﺘﯩﻤﺎﻟﻠﯩﻘﻰ ﺑﻮﻟﻐﺎﻥ ﻧﻪﺗﯩﺠﯩﻨﻰ ﻛﯚﯕﯜﻟـﺪﯨﻜﻰ ﻗﯩﻤﻤﻪﺗـﻜﻪ ﺋﺎﻳﻼﻧـﺪﯗﺭﯗﯞﯦﺘﯩﺶ
ﻳﺎﺧﺸﻰ ﺋﺎﺩﻩﺕ.
ﺗﯚﯞﻩﻧﺪﻩ DefaultEmptyﻧﻰ ﺋﯩﺸﻠﯩﺘﯩﺸﺘﯩﻦ ﺑﯩﺮ ﻣﯩﺴﺎﻝ:
ﻛﻮﺩ 4.53
var expr = customers.DefaultIfEmpty();
var customers = Enumerable.Empty<Customer>(); // Empty array
IEnumerable<Customer> customersEmpty =
customers.DefaultIfEmpty(Customer.Empty);
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 80
ﺑﺎﺷﻘﺎ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻼﺭ
Concatﺑﯩﻠﻪﻥ SequanceEqualﻣﻪﺯﻛﯘﺭ ﭘﺎﺭﺍﮔﺮﺍﻓﺘﯩﻜﻰ ﺋﻪﯓ ﺋﺎﺧﯩﺮﯨﻘﻰ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻼﺭ.
ﻛﯚﺭﯨﯟﯦﻠﯩﺸﻘﺎ ﺑﻮﻟﯩﺪﯗ Concat ،ﺋﺎﺭﻗﯩﻠﯩﻖ > IEnumerable<Tﺗﯩﭙﻠﯩﻖ ﺧﺎﻟﯩﻐﺎ ﺋﯩﻜﻜﻰ ﺩﺍﻧﻪ ﺗﯩﺰﻣﯩﻨﻰ ﺑﯩﺮ
ﺑﯩﺮﯨﮕﻪ ﺋﯘﻟﯩﻴﺎﻻﻳﻤﯩﺰ.
ﺗﯚﯞﻩﻧﺪﯨﻜﻰ ﻣﯩﺴﺎﻟﺪﺍ ،ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻜﻰ Italyﺑﻮﻟﻐﺎﻥ ﺧﯧﺮﯨﺪﺍﺭﻻﺭ ﺗﯩﺰﻣﯩﺴﯩﻨﻰ ﺩﯙﻟﻪﺕ ﺗﻪﯞﻩﻟﯩﻜﻰ USA
ﺑﻮﻟﻐﺎﻥ ﺧﯧﺮﯨﺪﺍﺭﻻﺭ ﺗﯩﺰﻣﯩﺴﯩﻐﺎ ﺋﯘﻻﺵ ﺋﯧﻠﯩﭗ ﺑﺎﺭﯨﺪﯗ:
ﻛﻮﺩ 4.54
var italianCustomers =
from c in customers
where c.Country == Countries.Italy
select c;
var americanCustomers =
from c in customers
where c.Country == Countries.USA
select c;
var expr = italianCustomers.Concat(americanCustomers);
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 81
SequenceEqual
ﺳﯧﻠﯩــﺸﺘﯘﺭﯗﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩــﺴﻰ ﻳﻪﻧﻪ ﺑﯩــﺮ ﻗﻮﻟﻠﯩﻨﯩــﺸﭽﺎﻥ ﻣﻪﺷــﻐﯘﻻﺗﭽﻰ ﺑﻮﻟــﯘﭖSequenceEqual ،
ﺋﺎﺭﻗﯩﻠﯩﻖ ﺋﻪﻣﻪﻟﮕﻪ ﺋﺎﺷﯘﺭﯗﻟﻐﺎﻥ:
public static bool SequenceEqual<T>(
this IEnumerable<T> first,
IEnumerable<T> second);
public static bool SequenceEqual<T>(
this IEnumerable<T> first,
IEnumerable<T> second,
;) IEqualityComparer<T> comparer
ﺳﯧﻠﯩﺸﺘﯘﺭﯗﺵ ﺟﻪﺭﻳﺎﻧﯩﺪﺍ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﮬﻪﺭﺑﯩﺮ ﺋﻪﺯﺍ ﻧﯩﺸﺎﻥ ﺗﯩﺰﻣﯩـﺪﯨﻜﻰ ﺋـﯚﺯﻯ ﺑﯩـﻠﻪﻥ ﺋﻮﺧـﺸﺎﺵ
ﺋﻮﺭﯗﻧﺪﯨﻜﻰ ﺋﻪﺯﺍ ﺑﯩﻠﻪﻥ ﺳﯧﻠﯩﺸﺘﯘﺭﯗﻟﯘﭖ ﭼﯩﻘﯩﺪﯗ .ﺋﻪﮔﻪﺭ ﺋﯩﻜﻜـﻰ ﺗﯩﺰﻣﯩﻨﯩـﯔ ﺑـﺎﺭﻟﯩﻖ ﺋﻪﺯﺍﻟﯧـﺮﻯ ﺋـﻮﺭﯗﻥ
ﺟﻪﮬﻪﺗــﺘﯩﻦ ﯞﻩ ﺳــﺎﻥ ﺟﻪﮬﻪﺗــﺘﯩﻦ ﺋﻮﺧــﺸﺎﺵ ﭼﯩﻘــﺴﺎ ﺋﺎﻧــﺪﯨﻦ ﺭﺍﺳــﺖ ﻗﺎﻳﺘﯩــﺪﯗ ،ﺧﺎﻟﯩﻐــﺎﻥ ﺑﯩﺮﺳــﻰ
ﻗﺎﻧﺎﺋﻪﺗﻠﻪﻧﻤﯩــﺴﻪ ﻳﺎﻟﻐــﺎﻥ ﻗﺎﻳﺘﯩــﺪﯗ .ﺋﻪﮔﻪﺭ ﺗﯩﺰﻣﯩــﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭ ﭼﺎﻗﯩﺮﯨﻠﻤــﺎ ﺗﯩﭙﻠﯩــﻖ ﺑﻮﻟــﺴﺎ ،ﺋﯘﻧﯩــﯔ
ﺳﯧﻠﯩــﺸﺘﯘﺭﯗﻟﯘﻕ ﺧــﯘﻟﻘﯩﻨﻰ ﻗــﻮﻝ ﺋــﺎﺭﻗﯩﻠﯩﻖ ﺋﯚﮔﻪﺭﺗﯩــﺸﯩﯖﯩﺰ ﻛﯧــﺮﻩﻙ .ﻳــﺎﻛﻰ ﺋﯩﻜﻜﯩﻨﭽــﻰ ﺧﯩـﻞ ﺋﻪﻧــﺪﯨﺰﻩ
ﺋﺎﺭﻗﯩﻠﯩﻖ ﺧﺎﺳﻼﺷﺘﯘﺭﯗﻟﻐﺎﻥ ﺳﯧﻠﯩﺸﺘﯘﺭﻏﯘﭺ ﺑﯩﻠﻪﻥ ﺗﻪﻣﯩﻨﻠﯩﺴﯩﯖﯩﺰﻣﯘ ﺑﻮﻟﯩـﺪﯗ) .ﺑـﯘ ﺗﻮﻏﺮﯨﻠﯩـﻖ ﺋﺎﻟـﺪﯨﻨﻘﻰ
ﻣﻪﺯﻣﯘﻧﻼﺭﺩﺍ ﺗﻮﺧﺘﺎﻟﻐﺎﻥ(
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 82
ﭼﺎﺭﯨﺴﻰ
][Deferred Query Evaluation and Extension Methods Resolution, 延迟的查询赋值与扩展方法
ﻧﻰ ﺋﯩﺠﺮﺍ ﻗﯩﻠﺴﺎﻕ ،ﺑﯩﺰﻧﯩﯔ ﺑﯘﺭﯗﻥ ﺑﯧﻜﯩﺘﯩﯟﺍﻟﻐﺎﻥ ﻣﯩـﺴﺎﻝ ﺋﯘﭼﯘﺭﻟﯩﺮﯨﻤﯩﺰﻏـﺎ ﺋﺎﺳﺎﺳـﻪﻥ،ﻧﻪﺗﯩﺠﻪ ﺋﯩﻜﻜـﻰ
ﭼﯩﻘﯩﺪﯗ ،ﻳﻪﻧﻰ ﺋﯩﭙﺎﺩﯨﺪﯨﻜﻰ ﺷﻪﺭﺗﻜﻪ ﭼﯜﺷﯩﺪﯨﻐﺎﻥ ﺋﯩﻜﻜﻰ ﺧﯧﺮﯨﺪﺍﺭ ﺑﺎﺭ .ﺋﻪﻣﺪﻯ ﻳﯧﯖـﻰ ﺧﯧﺮﯨـﺪﺍﺭﻻﺭﻧﻰ
ﻗﻮﺷﯘﺵ ﺋﺎﺭﻗﯩﻠﯩﻖ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﻨﻰ ﺋﯚﺯﮔﻪﺭﺗﻪﻳﻠﻰ )ﻳﯘﻗﯩﺮﯨﻘﻰ ﻛﻮﺩﯨﻨﯩﯔ ﻛﻪﻳﻨﯩﺪﯨﻨﻼ(:
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ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 83
ﻛﻮﺩ 4.55
Console.WriteLine("\nItems after source sequence modification:
{0}", expr.Count());
foreach (var item in expr) {
Console.WriteLine(item);
}
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ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 85
ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯗﺵ ﻣﻪﺷﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ
AsEnumerable
AsEnumerableﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ:
public static IEnumerable<T> AsEnumerable<T>(
;) this IEnumerable<T> source
Customers customersList = new Customers(customers);
var expr =
from c in customersList.AsEnumerable()
where c.City == "Brescia"
select c;
foreach (var item in expr) {
Console.WriteLine(item);
}
ToArrayﺑﯩﻠﻪﻥ ToList
ToArrayﺑﯩﻠﻪﻥ ToListﻻﺭ ﺑﻮﻟﺴﺎ ﻧﺎﮬﺎﻳﯩﺘﻰ ﻗﻮﻟﻠﯩﻨﯩﺸﭽﺎﻥ ﺋﺎﻟﻤﺎﺷـﺘﯘﺭﯗﺵ ﻣﻪﺷـﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺑﻮﻟـﯘﭖ
ﺋﺎﻳﺮﯨﻢ-ﺋﺎﻳﺮﯨﻢ ﮬﺎﻟﺪﺍ IEnumerable<T> ،ﺗﯩﭙﻠﯩﻖ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﻨﻰ Tﻧﯩـﯔ ﺭﯦﺘـﻰ ][ Tﮔﻪ ﯞﻩ Tﻧﯩـﯔ
ﻛﯚﭘﻤﺎﺱ ﺗﯩﺰﻣﯩﺴﻰ > List<Tﻏﺎ ﺋﺎﻟﻤﺎﺷﺘﯘﺭﯨﺪﯗ.
public static T[] ToArray<T>(
this IEnumerable<T> source);
public static List<T> ToList<T>(
;) this IEnumerable<T> source
List<Customer> customersList = new List<Customer>(customers);
var expr =
from c in customersList.ToList()
where c.Country == Countries.Italy
select c;
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 87
foreach (var item in expr) {
Console.WriteLine(item);
}
ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﯨﺴﯩﻨﯩﯔ ﻧﻪﺗﯩﺠﯩﺴﯩﻨﻰ ﻗﺎﻳﺘﺎ -ﻗﺎﻳﺘﺎ ﭼﺎﺭﻻﺷﻘﺎ ﺗـﻮﻏﺮﺍ ﻛﻪﻟﮕﻪﻧـﺪﻩ ﺑـﯘ ﻣﻪﺷـﻐﯘﻻﺗﭽﯩﻼﺭ
ﻧﺎﮬﺎﻳﯩﺘﻰ ﺋﻪﺱ ﻗﺎﺗﯩﺪﯗ .ﭼﯜﻧﻜﻰ ﻧﻮﺭﻣﺎﻝ ﮬﺎﻟﻪﺗﺘﻪ ،ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙـﺎﺩﻩ ﻧﻪﺗﯩﺠﯩـﺴﯩﻨﻰ ﮬﻪﺭﺑﯩـﺮ ﻗﯧـﺘﯩﻢ
ﭼــﺎﺭﻻﺵ ﺋﯩﭙﺎﺩﯨﻨﯩــﯔ ﺑﯩــﺮ ﻗﯧــﺘﯩﻢ ﺋﯩﺠــﺮﺍ ﺑﻮﻟﯘﺷــﯩﻨﻰ ﻛﻪﻟﺘــﯜﺭﯛﭖ ﭼﯩﻘﯩﺮﯨــﺪﯗ .ﺋﻪﮔﻪﺭ ﺋﯩﭙــﺎﺩﻩ ﺳــﺎﻧﺪﺍﻧﻐﺎ
ﻣﻪﺷــﻐﯘﻻﺕ ﺋﯧﻠﯩــﭗ ﺑﯧﺮﯨﯟﺍﺗﻘــﺎﻥ ﺑﻮﻟــﺴﺎ ،ﺋﯧﻨﯩﻘﻜــﻰ ﺋﯜﻧﯜﻣــﺪﯨﻦ ﺋﯘﺗﺘــﯘﺭﯗﭖ ﻗــﻮﻳﯩﻤﯩﺰ .ﺷــﯘﯕﺎ ﺑﯘﻧــﺪﺍﻕ
ﺋﻪﮬﯟﺍﻟﻼﺭﺩﺍ ﺳﯜﺭﯛﺷﺘﯜﺭﯛﻙ ﺋﯩﭙﺎﺩﻩ ﻧﻪﺗﯩﺠﯩﺴﯩﻨﻰ ToListﻳﺎﻛﻰ ToArrayﺋﺎﺭﻗﯩﻠﯩﻖ ﺋﻪﺯﺍﻻﺭﻧﯩﯔ ﺋﻪﻣﻪﻟﯩـﻲ
ﺗﻮﭘﻠﯩﺮﯨﻐﺎ ﺋﺎﻳﻼﻧﺪﯗﺭﯨﯟﯦﻠﯩﭗ ﺋﺎﻧﺪﯨﻦ ﻣﻪﺷﻐﯘﻻﺕ ﺋﯧﻠﯩﭗ ﺑﺎﺭﻏﺎﻥ ﺗﯜﺯﯛﻙ.
ﺗﯚﯞﻩﻧــﺪﯨﻜﻰ ﻣﯩــﺴﺎﻟﺪﺍ ToListﺋــﺎﺭﻗﯩﻠﯩﻖ ﻣﻪﮬــﺴﯘﻻﺗﻼﺭﻏﺎ ﺋﯧﻠﯩــﭗ ﺑﯧﺮﯨﻠﻐــﺎﻥ ﺳﯜﺭﯛﺷــﺘﯜﺭﯛﻙ ﻧﻪﺗﯩﺠﯩــﺴﻰ
ﻛﯚﭼﯩﺮﯨﯟﺍﻟﯩﺪﯗ:
ﻛﻮﺩ 4.59
var productsQuery =
(from p in products
where p.Price >= 30
select p)
.ToList();
var ordersWithProducts =
from c in customers
from o in c.Orders
join p in productsQuery
on o.IdProduct equals p.IdProduct
select new { p.IdProduct, o.Quantity, p.Price,
TotalAmount = o.Quantity * p.Price};
foreach (var order in ordersWithProducts) {
Console.WriteLine(order);
}
ToDictionary
ToDictionaryﺑﻮﻟــــﺴﺎ > Dictionary<K,Tﻗﯘﺭﯨــــﺪﯨﻐﺎﻥ ﻣﻪﺷــــﻐﯘﻻﺗﭽﻰ ﺑﻮﻟــــﯘﭖkeySelector ،
ﻛﯚﺭﺳﻪﺗﻜﯜﭼﯩﺴﻰ ﮬﻪﺭﺑﯩﺮ ﺋﻪﺯﺍﻧﯩﯔ ﺋﺎﭼﻘﯘﭼﻠﯘﻕ ﺳﯚﺯﯨﻨﻰ ﺗﻪﻛﺸﯜﺭﯨﺪﯗ elementSelector .ﺑﻮﻟـﺴﺎ)ﺋﻪﮔﻪﺭ
ﺗﻪﻣﯩﻨﻠﻪﻧﺴﻪ( ﮬﻪﺭﺑﯩﺮ ﺋﻪﺯﺍﻧﻰ ﺋﯧﻠﯩﺸﻘﺎ ﺋﯩﺸﻠﯩﺘﯩﻠﯩﺪﯗ .ﺑﯘ ﻛﯚﺭﺳﻪﺗﻜﯜﭼﻠﻪﺭ ﺗﯚﯞﻩﻧﺪﯨﻜﯩـﺪﻩﻙ ﺋﻪﻧـﺪﯨﺰﯨﻠﻪﺭﺩﻩ
ﺋﯩﭙﺎﺩﯨﻠﻪﻧﮕﻪﻥ:
public static Dictionary<K, T> ToDictionary<T, K>(
this IEnumerable<T> source,
Func<T, K> keySelector);
public static Dictionary<K, T> ToDictionary<T, K>(
this IEnumerable<T> source,
Func<T, K> keySelector,
IEqualityComparer<K> comparer);
public static Dictionary<K, E> ToDictionary<T, K, E>(
this IEnumerable<T> source,
Func<T, K> keySelector,
Func<T, E> elementSelector);
public static Dictionary<K, E> ToDictionary<T, K, E>(
this IEnumerable<T> source,
Func<T, K> keySelector,
Func<T, E> elementSelector,
IEqualityComparer<K> comparer);
var customersDictionary =
customers
www.udmish.cn LINQﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕ 89
.ToDictionary(c => c.Name,
c => new {c.Name, c.City});
ToLookup
ToLookupﻣﻪﺷﻐﯘﻻﺗﭽﯩــﺴﻰ ﻣﻪﻧــﺒﻪ ﺗﯩﺰﻣﯩــﺪﯨﻦ > Lookup<T,Kﺗﯩﭙﻠﯩــﻖ ﺗــﻮﭘﻼﻡ ﮬﺎﺳــﯩﻞ ﻗﯩﻠﯩــﺶ
ﯞﻩﺯﯨﭙﯩﺴﯩﻨﻰ ﺋﯚﺗﻪﻳﺪﯗ Lookup<T,K> .ﻧﯩﯔ ﺋﯧﻨﯩﻘﻠﯩﻤﯩﺮﻯ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ:
public class Lookup<K, T> : IEnumerable<IGrouping<K, T>> {
public int Count { get; }
public IEnumerable<T> this[K key] { get; }
public bool Contains(K key);
public IEnumerator<IGrouping<K, T>> GetEnumerator();
}
> Lookup<T,Kﺗﯩﭙﯩﻨﯩﯔ ﮬﻪﺭ ﺑﯩﺮ ﺋﻮﺑﯩﻴﯩﻜﺘﻰ ﺑﯩﺮﺩﺍﻧﻪ »ﺑﯩﺮﺩﯨﻦ ﻛﯚﭘﻜﻪ« ﻟﯘﻏﯩﺘﯩﮕﻪ ﻣـﺎﺱ ﻛﯧﻠﯩـﺪﯗ.
ﻳﻪﻧﻰ Linqﺩﯨﻜﻰ GroupJoinﺧﺎﺱ ﺳﯚﺯﯨﻨﯩﯔ ﻧﻪﺗﯩﺠﯩﺴﯩﮕﻪ ﺋﻮﺧﺸﯩـﺸﯩﭗ ﻛﯧﺘﯩـﺪﯗ .ﺗﯚﯞﻩﻧﺪﯨﻜﯩـﺴﻰ
ToLookupﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﯩﻨﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﻠﯩﺮﻯ:
public static Lookup<K, T> ToLookup<T, K>(
this IEnumerable<T> source,
Func<T, K> keySelector);
public static Lookup<K, T> ToLookup<T, K>(
www.udmish.cn ﮬﻪﻗﻘﯩﺪﻩ ﺳﺎﯞﺍﺕLINQ 90
this IEnumerable<T> source,
Func<T, K> keySelector,
IEqualityComparer<K> comparer);
public static Lookup<K, E> ToLookup<T, K, E>(
this IEnumerable<T> source,
Func<T, K> keySelector,
Func<T, E> elementSelector);
public static Lookup<K, E> ToLookup<T, K, E>(
this IEnumerable<T> source,
Func<T, K> keySelector,
Func<T, E> elementSelector,
IEqualityComparer<K> comparer);
var ordersByProduct =
(from c in customers
from o in c.Orders
select o)
.ToLookup(o => o.IdProduct);
Console.WriteLine( "\n\nNumber of orders for Product 1: {0}\n",
ordersByProduct[1].Count());
foreach (var product in ordersByProduct) {
Console.WriteLine("Product: {0}", product.Key);
foreach(var order in product) {
Console.WriteLine(" {0}", order);
Product: 3
20 - True - December – 3
20 - True - December – 3
Product: 5
20 - False - July - 5
OfTypeﺑﯩﻠﻪﻥ Cast
OfTypeﺑﯩـــﻠﻪﻥ Castﺋﺎﻟﻤﺎﺷـــﺘﯘﺭﯗﺵ ﻣﻪﺷـــﻐﯘﻻﺗﭽﯩﻠﯩﺮﻯ ﺋﯩﭽﯩـــﺪﯨﻜﻰ ﺋﻪﯓ ﺋـــﺎﺧﯩﺮﯨﻘﻰ ﺋﯩﻜﻜﯩـــﺴﻰ.
OfTypeﻣﻪﻧﺒﻪﺩﯨﻜﻰ ﺋﻪﺯﺍﻻﺭﻧﻰ ﭼﺎﺭﻻﭖ ﭘﻪﻗﻪﺕ ﺗﯩﭙﻰ Tﺑﻮﻟﻐﺎﻧﻨﯩﻼ ﻳﯩﻐﯩﯟﺍﻟﯩﺪﯗ)ﺷﯘﻧﯩﯖﺪﯨﻦ ﻛﯚﺭﯨﯟﯦﻠﺸﻘﺎ
ﺑﻮﻟﯩﺪﯗ ،ﺑﯩﺮ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﺋﻪﺯﺍﻻﺭ ﺋﻮﺧﺸﯩﻤﯩﻐﺎﻥ ﺗﯩﭙﻠﯩـﻖ ﺑﻮﻟﯘﺷـﯩﻤﯘ ﻣـﯘﻣﻜﯩﻦ( .ﻣﻪﺳـﯩﻠﻪﻥ :ﺋﻮﺑﯩﻜﯩﺒﯩﺘﻘـﺎ
ﻳﯜﺯﻟﻪﻧﮕﻪﻥ ﭘﺮﻭﮔﺮﺍﻣﻤﺎ ﻻﻳﮫﯩﻴﯩﻠﻪﺵ ﭘﯩﺮﯨﻨﺴﯩﭙﻰ ﺑـﻮﻳﯩﭽﻪ ،ﻣﻪﻧـﺒﻪ ﺗﯩﺰﻣﯩـﺪﺍ ﺑﻪﻟﻜﯩـﻢ ﺋﻮﺧـﺸﺎﺵ ﺋﺎﺗﯩـﺪﯨﻦ
ﺑﻮﻟﻐــﺎﻥ ﺋﻮﺧــﺸﯩﻤﯩﻐﺎﻥ ﺗﯩﭙﻠﯩــﻖ ﺋﻪﺯﺍﻻﺭ ﺑﻮﻟﯘﺷــﻰ ﻣــﯘﻣﻜﯩﻦ)ﺋﻮﺧــﺸﺎﺵ ﺑﯩــﺮ ﺗﯩﭙﻘــﺎ ﯞﺍﺭﯨــﺴﻠﯩﻖ ﻗﯩﻠﻐــﺎﻥ(.
ﮔﻪﺭﭼﻪ ﺋﯘﻻﺭﻧﯩﯔ ﮬﻪﻣﻤﯩﺴﻰ ﺋﺎﺗﯩﺴﯩﻨﯩﯔ ﺋﯩﻘﺘﯩﺪﺍﺭﻯ ﺑﻮﻟﺴﯩﻤﯘ ﻟﯧﻜﯩﻦ ﻳﻪﻧﯩﻼ ﺑﺎﺷﻘﺎ -ﺑﺎﺷﻘﺎ ﺗﯩﭗ.
public static IEnumerable<T> OfType<T>(
;) this IEnumerable source
ﺋﻪﮔﻪﺭ ﺗﻪﻣﯩﻨﻠﯩﮕﻪﻥ ﺗﯩﭗ Tﻧﯩﯔ ﺋﻮﺑﯩﻴﯩﻜﺘﻰ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺪﺍ ﺑﺎﻳﻘﺎﻟﻤﯩﺴﺎ ،ﻗﯘﺭﯗﻕ ﺗﯩﺰﻣﺎ ﻗﺎﻳﺘﯘﺭﯨﺪﯗ.
Castﻣﻪﺷﻐﯘﻻﺗﭽﯩﺴﻰ ﻣﻪﻧﺒﻪ ﺗﯩﺰﻣﯩﺪﯨﻜﻰ ﮬﻪﺭﺑﯩﺮ ﺋﻪﺯﺍﻧﻰ ﭼﺎﺭﻻﺵ ﺟﻪﺭﻳﺎﻧﯩﺪﺍ ﺋﯘﻧﯩﯔ ﺗﯩﭙﯩﻨﻰ ﺑﯧـﺮﯨﻠﮕﻪﻥ
Tﻏــــــﺎ ﺋﺎﻳﻼﻧــــــﺪﯗﺭﯗﭖ ﻳﯩﻐﯩﯟﺍﻟﯩــــــﺪﯗ .ﺋﻪﮔﻪﺭ ﺋﺎﻟﻤﺎﺷــــــﺘﯘﺭﯗﺵ ﻣﯘﯞﺍﭘﯩﻘﯩﻴﻪﺗﻠﯩــــــﻚ ﺑﻮﻟﻤﯩــــــﺴﺎ
InvalidCastExceptionﺗﯩﭙﻠﯩﻖ ﺑﯩﻨﻮﺭﻣﺎﻟﻠﯩﻖ ﭼﯩﻘﯩﺮﯨﺪﯗ .ﺋﯘﻧﯩﯔ ﺋﻪﻧﺪﯨﺰﯨﺴﻰ ﺗﯚﯞﻩﻧﺪﯨﻜﯩﭽﻪ:
public static IEnumerable<T> Cast<T>(
;) this IEnumerable source