با سلام خدمت کاربران عزیز در این جلسه قصد داریم چند اپراتور باقی مانده در مبحث LINQ را بررسی کنیم تا پیش نیاز لازم را برای شروع مبحث LINQ to SQL داشته باشیم و از جلسه ی بعدی به توضیح و بررسی آن بپردازیم.
متد Aggregate
کاربرد این متد زمانی است که می خواهیم کل عناصر یک مجموعه بر اساس الگوی خاصی رفتار کنند، این رفتار با شروع از عنصر اول و دوم و اعمال نتیجه به عنصر سوم و الی آخر انجام می شود. احتمالا توضیح آن کمی گیج کننده بود اجازه دهید با بررسی یک مثال کاربرد آن را شرح دهیم.
مثال:
در ابتدای برنامه یک آرایه int
در اختیار داریم که اعضای آن اعداد 1 تا 9 هستند. هدف ما گرفتن فاکتوریل از اعضای آرایه است.
این الگو به راحتی در متد Aggregate
قابل پیاده سازی است برای این منظور کد a, b) => a * b)
درون متد می نویسیم. منظور از a عدد اول و b عدد دوم است. در مرحله ی اول a=1
و b=2
است که حاصل ضرب آن ها عدد 2 خواهد بود حالا a=2
(حاصل مرحله ی اول) و b=3 است که حاصل ضرب آن ها 6 خواهد بود به همین ترتیب در مرحله ی بعدa=6
و b=4
می شود تا به پایان برسد.
در مرحله ی بعد یک آرایه ی string
تعریف شده است که ما قصد داریم اعضای آن همراه با ','
یا هر چیز دیگری از هم جدا کنیم برای تکرار این الگو برای تمامی اعضا کدa, b) => a + "," + b)
را در متد می نویسیم.
برای پیاده سازی کد به روش Query باید تغییرات زیر را انجام دهید:
خروجی مثال Aggregate
همان طور که در خروجی مشخص است مقدار 9! محاسبه شده است و اعضای آرایه ی string
با ','
جدا شده اند.
حالا تغییرات زیر را در کد بالا اعمال کنید و خروجی را مشاهده کنید:
در مرحله ی اول a=1
و b=2
خواهد بود. همان طور که در الگو مشخص شده ابتدا باید یک واحد به a اضافه و سپس با b جمع شود که حاصل برابر 4 خواهد شد در مرحله ی بعد a=4
و b=3
می شود. دوباره باید به مقدار a یک واحد اضافه و سپس با b جمع شود تا حاصل برابر 8 شود این عملیات تا رسیدن به آخرین عضو آرایه به همین ترتیب ادامه خواهد داشت تا در آخر عدد 53 حاصل شود.
در مورد آرایه ی string
هدف ما ابتدا چاپ ->
و سپس ایجاد کارکتر کنترلی "t\"
است. برنامه را اجرا و خروجی را مشاده کنید.
خروجی مثال بعد از تغییرات
متد GroupBy
از این متد برای گروه بندی آیتم ها در یک مجموعه یا لیست بر اساس یک کلید خاص و یک فیلد استفاده می شود. این متد از نظر کاربرد تا حد زیادی به GroupBy
در SQL شباهت دارد.
به مثال زیر توجه کنید:
هدف ما در این مثال مرتب سازی اعضای یک مجموعه بر اساس فیلد Location
است. توجه داشته باشید که در این متد منظور از Key همان فیلدی است که اطلاعات بر اساس آن طبقه بندی می شود که در این مثال مقدار Key فیلد Location
است.
در foreach
اول هدف ما چاپ مقادیر فیلد Location
و تعداد آن است همان طور که مشاهده می کنید برای دستیابی به مقادیر فیلد از کلمه ی Key استفاده شده است.
در foreach
دومی که در داخل اولی قرار دارد، قصد داریم به فیلد های کلاس Student
دست پیدا کنیم به همین منظور بر روی شئ پیمایش کننده حلقه ی اول یک پیمایش دیگر انجام می دهیم اگر موس را بر روی stud
قرار دهید می بینید که شئ از کلاس Student
است. بنابراین به تمامی فیلد های آن دسترسی دارد و می توان با دستور مناسب آن را چاپ نمود.
روش Query:
یا
خروجی مثال اول GroupBy
احتمالا متوجه شدید که این متد شباهت بسیار زیادی به متد ToLookup
دارد حالا اجازه دهید همین مثال را با متدToLookup
تغییر دهیم و آن را بررسی کنیم.
تغییرات زیر را بر روی مثال قبلی انجام دهید:
فقط کافی است جای GroupBy
را با ToLookup
عوض کنید در ضمن در کد بالا در حلقه ی دوم می توانید به جای[student[sitem.Key
از sitem
(پیمایشگر حلقه ی اول) استفاده کنید.
اگر کد را اجرا کنید می بینید که خروجی دقیقا مانند قبل است فقط روش پیاده سازی آن متفاوت است.
متد SequenceEqual
یک متد مقایسه گر است که تست تساوی را بر روی دو دنباله از اطلاعات انجام می دهد. خروجی این متد در صورتی که تمامی عناصر یک مجموعه دو به دو یکسان باشند true و در غیر این صورت false است.
به مثال زیر توجه کنید:
اعضای موجود در آرایه های arr1
و arr2
کاملا یکسان هستند اما در کوچک و بزرگ بودن حروف متفاوت اند. در دو آرایه ی arr3
و arr4
هم شرایط به همین صورت است. با استفاده از متد SequenceEqual
شرایط تساوی را بررسی کردیم. برنامه را اجرا و خروجی را مشاهده کنید می بینید که Result1
و Result3
هر دو false هستند.
Result1
حاصل تست تساوی بین دو آرایه ی arr1
و arr2
است. پس نتیجه می گیریم که متد SequenceEqual
به بزرگ یا کوچک بودن حروف حساس است برای این که این حساسیت را از بین ببریم باید ازStringComparer.OrdinalIgnoreCase
در متد استفاده کنیم. می بینید که Result2 و Result4 هر دو true هستد چون در بررسی تساوی از StringComparer.OrdinalIgnoreCase
در متدSequenceEqual
استفاده کرده ایم.
IComparable
برای آن کلاس و نوشتن متد CompareTo
است.متد Concat
همان طور که از نام این متد ساده پیداست کاربرد آن در وصل کردن دو مجموعه به یکدیگر است به طوری که اگر در دو مجموعه عنصری تکراری وجود داشته باشد آن عنصر حذف نخواهد شد و در مجموعه ی جدیدی که حاصل اتصال دو مجموعه قبلی است عنصر تکراری به دفعات تکرار در دو مجموعه قبلی تکرار خواهد شد.
این متد تا حدودی شبیه به Union
است با این تفاوت که متد Union عناصر تکراری را حذف می کرد و در مجموعه ی جدید عنصری که دارای تکرار بود فقط یک بار در نظر گرفته می شد. برای درک بیشتر به شکل زیر که مفهوم کلی متد Concat
را نشان می دهد توجه کنید:
مفهوم کلی متد Concat
مثال :
در این مثال دو آرایه ی arr1
و arr2
که هر دو دارای عناصر تکراری هستند و با استفاده از متد Concat
به هم متصل شده اند. مشاهده می کنید که هیچ حذفی صورت نگرفته و تمامی عناصر تکراری در خروجی چاپ شده اند.
روش Quey:
خروجی مثال متد Concat
متد Range
از این متد برای تولید دنباله ای از اعداد در یک محدوده ی خاص استفاده می شود.
الگوی استفاده از آن به صورت زیر است:
این متد بر روی هیچ مجموعه یا شئ فراخوانی نمی شود و به صورت static استفاده می شود و در کلاس Enumerable
قرار دارد. هر دو پارامتر ورودی آن از نوع int
هستند که اولی مشخص می کند، تولید دنباله از چه عددی شروع شود و پارامتر دوم تعداد اعضای دنباله را مشخص می کند.
به مثال زیر توجه کنید:
در این مثال شروع شمارش از 100 و تعداد آن ها 10 در نظر گرفته شده بنابراین خروجی از 100 تا 109 خواهد بود که توسطforeach
قابل دستیابی است.
متد Repeat
این متد یک عدد را به تعداد مرتبه ی مشخصی تکرار می کند که الگوی استفاده از آن به صورت زیر است:
این متد بر روی هیچ مجموعه یا شئ فراخوانی نمی شود و به صورت static استفاده می شود و در کلاس Enumerable
قرار دارد. هر دو پارامتر ورودی آن از نوع int
هستند که اولی مشخص می کند، چه عددی باید تکرار شود و پارامتر دوم تعداد تکرار را مشخص می کند.
به مثال زیر توجه کنید:
در این مثال عدد 524 که پارامتر اول متد Repeat
است 3 با تکرار می شود.
خب دوستان مقدمه ی آموزش LINQ در C# در این بخش به پایان می رسد. در طول دوره ی مقدماتی سعی شد متدهایی که کاربرد بیشتری دارند با مثال های بیشتری بررسی شوند. متدهایی مثل AsEnumerable
و Cast
و Range
و چند متد دیکر که کمتر در مورد آن ها بحث شد متدهایی هستند که به تنهایی هیچ کاربردی ندارند و استفاده از آن ها بی معنی است و زمانی کاربرد آن ها مفید است که در کنار دیگر متدها استفاده شود.
در قسمت های بعدی آموزش سعی می شود در مثال های پیچیده تر از این متدها استفاده کنیم تا کاربرد دقیق آن ها درک کنید. کلیه ی مثال های بررسی شده در طی این دوره شامل مبحث LINQ to Object بودند بنابراین از قسمت بعدی آموزش مبحث LINQ to SQL را شروع می کنیم.
موفق باشید.
منبع: روکسو