سلام و عرض ادب خدمت کاربران عزیز در این جلسه قصد داریم با اپراتورهای Set در LINQ و کاربرد آن ها آشنا شویم.
Set Operators چیست؟
به طور کلی این اپراتورها برای بررسی اجتماع یا اشتراک یا تفاوت بین مجموعه ها استفاده می شود که در ادامه هر یک را به طور کامل با استفاده از مثال بررسی خواهیم کرد.
اپراتورهای Set به چهار بخش تقسیم بندی می شوند که خلاصه ی کاربرد هر یک در جدول زیر نشان داده شده است:
Union
Intersect
- Distinct
Except
کاربرد | نام اپراتور |
دو یا چند مجموعه را به یک مجموعه با عضوهای غیر تکراری تبدیل می کند (عمل اجتماع) | Union |
بر روی دو یا چند مجموعه عمل اشتراک گیری را انجام می دهد و عضو(های) مشترک را مشخص می کند | Intersect |
بر روی یک مجموعه عمل و عضو های تکراری را حذف می کند. | Distinct |
عضوی (اعضایی) که در مجموعه اول موجود ولی در مجموعه ی دوم موجود نیستند را بر می گرداند (عضو متفاوت را مشخص می کند). | Except |
متد Union
به تصویر زیر دقت کنید:
مفهوم کلی Union
در شکل بالا مجموعه ی اول، آرایه ای به صورت [a,b,c,d]
و مجموعه ی دوم [a,b,e,f]
است که اجتماع آن ها به صورت مجموعه ی [a,b,c,d,e,f]
نشان داده شده است.
الگوی کلی استفاده از Union
به صورت زیر است:
منظور از count1
و count2
دو مجموعه ی مختلف از داده ها می باشد.
برای درک بهتر موضوع به مثال زیر توجه کنید:
در این مثال دو آرایه از جنس string با عناصر مختلف تعریف شده است. دو مجموعه دارای تعدادی عناصر تکراری و غیر تکراری هستند. با استفاده از متد Union
بر روی دو آرایه عمل اجتماع را پیاده سازی کرده ایم که نتیجه ی آن در result
ذخیره می شود و داده ها با استفاده از یک حلقه قابل دستیابی خواهد بود.
در این مثال برای آشنایی بیشتر با کاربرد متدها در کنار هم از متد OrderBy
برای مرتب سازی عناصر بر اساس ABC استفاده شده است. برای درک کاربرد آن می توانید OrderBy
را حذف کرده و تفاوت خروجی را مشاهده کنید.
مانند بخش های قبلی کد بالا را به صورت Query پیاده سازی می کنیم که به صورت زیر می باشد:
به نحوه ی کاربرد Union
و OrderBy
دقت کنید.
سوال: آیا (count1.Union(count2
با (count2.Union(count1
تفاوت دارد.
جواب: خیر، کاربرد کلی Union
پیاده سازی عمل اجتماع است و مهم نیست که بر روی کدام مجموعه Union
فراخوانی شده و کدام مجموعه به عنوان پارامتر به آن ارسال شده است. پس خروجی هر دو مشابه خواهد بود.
خروجی مثال اول- Union
متد Intersect
مفهوم کلی Intersect
به تصویر زیر دقت کنید:
طبق عکس بالا دو مجموعه ی [a,b,c,d]
و [a,b,e,f]
وجود دارد که با استفاده از متد Intersect
می توان مجموعه ای جدید تولید کرد که اعضای آن عناصر مشترک در دو مجموعه ی قبل هستند.
الگوی استفاده از آن به صورت زیر است:
برای آشنایی بیشتر با کاربرد آن به مثال زیر دقت کنید:
این مثال کاملا مشابه مثال مربوط به Union
است فقط در اینجا به جای عمل اجتماع با استفاده از متد Intersect
عمل اشتراک پیاده سازی شده است. در نتیجه ی آن اعضایی که در هر دو آرایه وجود دارند به عنوان خروجی در نظر گرفته می شوند.
پیاده سازی آن با روش Query به صورت زیر است:
خروجی مثال Intersect
لازم به ذکر است که در این متد مانند متد Union
تفاوتی ندارد که کدام مجموعه متد را فراخوانی کرده و کدام مجموعه به عنوان پارامتر به آن ارسال شده در هر صورت خروجی یکسان خواهد بود.
متد Distinct
به تصویر زیر توجه بفرمایید:
مفهوم کلی Distinct
همان طور که در عکس بالا مشاهده می کنید مجموعه ی [a,b,c,c,d,e]
دارای عضو تکراری است اما بعد از استفاده از متد Distinct
عضو تکراری از مجموعه حذف شده و مجموعه ای جدید به عنوان خروجی در نظر گرفته شده است.
الگوی استفاده از این متد به صورت زیر است:
برای آشنایی بیشتر با متدDistinct
به مثال زیر دقت کنید:
در اینجا یک آرایه از string
داریم که دارای عناصر تکراری است. به اعضای آرایه دقت کنید عناصری که تکراری هستد با حروف کوچک و بزرگ نوشته شده اند.
بازنویسی کد با روش Query به صورت زیر است:
خروجی مثال Distinct
شکل بالا به عنوان خروجی نشان داده شده است همان طور که مشاهده می کنید متد Distinct
به بزرگ یا کوچک بودن حروف حساس است و فقط عناصری را حذف می کند که دقیقا مثل هم نوشته شده باشند. (از نظر کوچک و بزرگ بودن حروف)
متد Except
برای درک بهتر به شکل زیر توجه کنید:
مفهوم کلی Except
در اینجا مجموعه ی [a,b,c,d,e]
اول و مجموعه ی [a,b,e,f]
، دوم فرض شده است. می بینید که در اولی عضو C وجود دارد اما در دومی موجود نیست. Except
دقیقا عنصر یا عناصری را به عنوان خروجی در نظر می گیرد که در مجموعه ی اول موجود ولی در مجموعه ی دوم موجود نباشد.
الگوی کلی استفاده از آن به صورت زیر است:
سوال: آیا در متد Except
مانند متدهای Intersect
و Union
فرقی دارد که کدام مجموعه متد را فراخوانی کرده و کدام مجموعه به عنوان پارامتر در آن قرار گرفته است؟
جواب: بله، در واقع در زمان استفاده از این متد مجموعه ای که این متد را فراخوانی کرده به عنوان مجموعه ی اول و مجموعه ای که به عنوان پارامتر به متد وارد می شود، مجموعه ی دوم تلقی می شود.
برای درک بهتر به مثال زیر توجه کنید:
در این مثال دو آرایه تعریف شده که هر آرایه دارای 3 عضو مشابه با آرایه ی دیگر و یک عضو متفاوت است. در اینجا arr1
مجوعه ی اول و arr2
مجموعه ی دوم در نظر گرفته شده است. حالا کد را در IDE خود نوشته و خروجی را مشاهده کنید. خواهید دید که خروجی کلمه ی Emily خواهد بود که در arr1
وجود دارد ولی در arr2
موجود نیست.
حالا تغییر زیر را در کد اعمال و بار دیگر خروجی را مشاهده کنید:
همان طور که می بینید خروجی حالت دوم، کلمه ی Freddie است که دلیل آن کاملا مشخص است چون در اینجا مجموعه ی arr2
متد را فراخوانی کرده و arr1
به عنوان پارامتر به متد ارسال شده است. در واقع متد Except
عضوی (اعضایی) است که در arr2
موجود بوده ولی arr1
موجود نیست و آن به عنوان خروجی در نظر می گیرد.
برای نوشتن کد به روش Query کد را به این صورت تغییر می دهیم:
این بخش از آموزش به پایان رسید. در قسمت بعدی آموزش با اپراتورهای joining در LINQ آشنا خواهیم شد.
منبع: روکسو