دسته بندی مقالات
- بیشتر -محصولات
- بیشتر -آخرین مقالات
- بیشتر --
Predicate در سی شارپ
1404/11/29 -
برنامه نویسی شی گرا در جاوا چیست؟
1404/11/29 -
آموزش اجرای برنامه های Java
1404/11/28 -
زبان برنامه نویسی جاوا چیست؟
1404/11/27 -
مفهوم Log File در SQL Server
1404/11/27 -
استفاده از And در سی شارپ
1404/11/26
Predicate در سی شارپ
مقدمه
در برنامهنویسی مدرن، نوشتن کدهای قابل نگهداری، خوانا و انعطافپذیر اهمیت بالایی دارد.
یکی از ابزارهای قدرتمند در این مسیر، استفاده از Delegateها و بهطور خاص Predicateها است.
Predicate به شما اجازه میدهد منطق شرطی را بهصورت قابل انتقال و ماژولار تعریف کنید.
این موضوع در فیلتر کردن دادهها، اعتبارسنجی، جستجو در لیستها و کار با LINQ نقش بسیار مهمی دارد.
Predicate در سیشارپ چیست؟
در سیشارپ، Predicate یک نوع Delegate از پیش تعریفشده است که برای بررسی شرایط استفاده میشود.
این Delegate یک ورودی دریافت میکند و نتیجهای از نوع Boolean برمیگرداند؛ یعنی یا true یا false.
به عبارت سادهتر، Predicate در واقع تابعی است که مشخص میکند آیا یک شرط خاص برقرار است یا خیر.
در کتابخانه پایهای NET.، تعریف آن به شکل زیر است:
public delegate bool Predicate<in T>(T obj);
این تعریف به ما میگوید:
تابع یک ورودی از نوع T دریافت میکند.
نتیجهی خروجی آن همیشه از نوع bool خواهد بود.
بنابراین، هرگاه بخواهید یک شرط منطقی روی یک داده بررسی کنید، میتوانید از Predicate بهره ببرید.
ساختار Predicate در سیشارپ
Predicate در سیشارپ یک Generic Delegate است که میتواند با انواع مختلف دادهها کار کند.
ساختار کلی آن به دو شکل قابل تعریف است:
با نام متد
Predicate<Type> name = methodName;
با استفاده از Lambda Expression
Predicate<Type> name = x => condition;
اجزای اصلی Predicate
درک دقیق این اجزا به شما کمک میکند تا در پروژههای واقعی بتوانید از Predicate بهدرستی استفاده کنید:
-
T (نوع داده) → مشخص میکند شرط روی چه نوع دادهای اعمال میشود.
-
پارامتر ورودی → دادهای که قرار است بررسی شود.
-
خروجی bool → نتیجه بررسی شرط، که یا true و یا false است.
-
منطق شرطی → بدنه تابع که بر اساس آن خروجی مشخص میشود.
یک مثال ساده از Predicate
فرض کنید میخواهیم بررسی کنیم که یک عدد آیا بزرگتر از ۱۰ است یا نه.
برای این کار میتوانیم از Predicate استفاده کنیم:
Predicate<int> isGreaterThanTen = number => number > 10;
bool result = isGreaterThanTen(15); // نتیجه: true
در این مثال:
ورودی: یک عدد صحیح (`int`) که قرار است بررسی شود.
شرط: آیا عدد بزرگتر از ۱۰ است؟
خروجی: یک مقدار منطقی ( یا false) که نشان میدهد آیا شرط برقرار است یا خیر.
به عبارت دیگر، Predicate این امکان را میدهد که یک شرط ساده را به شکل کوتاه و خوانا تعریف کرده و هر زمان که بخواهیم، آن را روی مقادیر مختلف اعمال کنیم.
در این مثال، چون عدد ۱۵ بزرگتر از ۱۰ است، خروجی true خواهد بود.
اگر عدد ۸ را بررسی کنیم، نتیجه false خواهد بود.
چرا از Predicate استفاده میکنیم؟
یکی از سؤالات پرتکرار در برنامهنویسی سیشارپ این است: چرا باید از Predicate استفاده کنیم؟
در پروژههای واقعی، ما اغلب با سناریوهایی مواجه میشویم که نیاز داریم:
-
دادهها را فیلتر کنیم
-
شرطهای مختلف را بررسی کنیم
-
منطق تصمیمگیری را از بدنه اصلی برنامه جدا کنیم
-
کدهایی بنویسیم که قابل استفاده مجدد باشند
Predicate دقیقاً برای همین منظور طراحی شده است و کار با آن باعث میشود برنامه ما هم کوتاهتر و هم خواناتر باشد.
مزایای استفاده از Predicate
استفاده از Predicate تنها به نوشتن شرط ساده محدود نمیشود؛ بلکه تاثیر بزرگی روی ساختار کد دارد:
کاهش تکرار کد (DRY Principle)
به جای نوشتن چندین بار یک شرط مشابه، میتوانیم آن را یکبار تعریف کرده و بارها استفاده کنیم.
افزایش خوانایی
شرطها به شکل واضح و مختصر نوشته میشوند و خواننده کد سریع متوجه منطق میشود.
جداسازی منطق شرطی
Predicate باعث میشود منطق تصمیمگیری از بخش اصلی برنامه جدا شده و مدیریت آن سادهتر شود.
استفاده آسان در متدهای استاندارد
متدهایی مثل Find، Exists یا حتی RemoveAll در لیستها به راحتی با Predicate کار میکنند.
هماهنگی کامل با LINQ
Predicate با روشهای LINQ مثل `Where` و `Any` سازگار است و کار با دادهها را بسیار منعطف میکند.
افزایش قابلیت تستپذیری (Testability)
چون Predicate منطق شرطی را به شکل جداگانه دارد، نوشتن تستهای واحد برای آن سادهتر است.
به طور خلاصه، خروجی Predicate همیشه true یا false است، اما این ساده بودن باعث میشود بتوانیم منطقهای پیچیده را به بخشهای کوچک و قابل استفاده مجدد تقسیم کنیم و کد ما هم تمیزتر و هم قدرتمندتر باشد.

مثالهای کاربردی Predicate در پروژههای واقعی
در این بخش، چند سناریوی واقعی از پروژههای سازمانی را بررسی میکنیم تا ببینیم چگونه Predicate میتواند کد را کوتاهتر، خواناتر و انعطافپذیرتر کند.
مثال 1: فیلتر کاربران فعال
فرض کنید در یک پروژه ASP.NET Core در حال توسعه سیستم مدیریت کاربران هستید و میخواهید فقط کاربران فعال را پیدا کنید.
public class User
{
public string Name { get; set; }
public bool IsActive { get; set; }
}
// تعریف Predicate برای کاربران فعال
Predicate<User> activeUsers = user => user.IsActive;
// لیست کاربران
List<User> users = GetUsers();
// فیلتر کاربران فعال
List<User> result = users.FindAll(activeUsers);
در این مثال، Predicate شرطی ساده تعریف میکند: فقط کاربران با IsActive = true انتخاب شوند.
با این روش، کد خواناتر و قابل استفاده مجدد میشود و میتوانید در هر جای پروژه از activeUsers استفاده کنید.
مثال 2: اعتبارسنجی فرم ثبتنام
در بسیاری از پروژهها نیاز داریم ورودیهای کاربران را بررسی کنیم، مثل بررسی فرمت ایمیل.
Predicate<string> isValidEmail = email => email.Contains("@");
bool result = isValidEmail("test@gmail.com"); // خروجی: true
با استفاده از Predicate، منطق اعتبارسنجی کوتاه و واضح است.
در پروژههای بزرگتر میتوانید تمام Predicateهای اعتبارسنجی را در یک کلاس Validation جداگانه نگهداری کنید تا کد مرتب و سازماندهی شده باقی بماند.
مثال 3: حذف دادههای نامعتبر از لیست
گاهی لازم است مقادیر نامعتبر یا غیرمجاز را از یک لیست حذف کنیم
List<int> scores = new List<int> { -1, 20, 15, -5 };
// حذف تمام نمرههای منفی
scores.RemoveAll(score => score < 0);
در این مثال، Predicate کمک میکند که منطق حذف دادهها واضح و مختصر باشد. تمام مقادیر منفی به راحتی از لیست حذف میشوند بدون نیاز به حلقههای پیچیده.
آیا به دنبال یک فرصت عالی برای یادگیری برنامهنویسی هستید؟ 🚀
با دوره آموزشی سیشارپ ما، شما میتوانید مهارتهای خود را به سطح جدیدی ارتقا دهید! این دوره بهطور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامهنویسی سیشارپ پیش بروید.
👨🏫 چرا دوره ما را انتخاب کنید؟
- محتوای جامع و عملی: با پروژههای واقعی و تمرینات عملی، یادگیری را به تجربهای جذاب تبدیل کنید.
- مدرس مجرب: از تجربه و دانش مدرس حرفهای بهرهمند شوید که شما را در هر مرحله از یادگیری راهنمایی میکنند.
- پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
- دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، میتوانید به آن مراجعه کنید.
💡 فرصت را از دست ندهید!
بایادگیری سیشارپ، میتوانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژههای جذاب و چالشبرانگیز شرکت کنید.
همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آیندهای روشنتر بردارید!
تفاوت Predicate و Func در سیشارپ
یکی از سوالاتی که اغلب برنامهنویسان سیشارپ با آن مواجه میشوند این است: تفاوت Predicate با Func چیست؟
در نگاه اول، هر دو در دستهی Delegateها قرار میگیرند و شبیه هم به نظر میرسند، اما در واقع کاربرد و محدودیتهای متفاوتی دارند که دانستن آنها میتواند کد شما را خواناتر و هدفمندتر کند.
Predicate
Predicate یک Delegate است که برای بررسی یک شرط منطقی طراحی شده است.
ویژگیهای اصلی آن عبارتند از:
- فقط یک پارامتر ورودی دارد.
- همیشه خروجی از نوع bool است، یعنی نتیجه بررسی شرط یا درست (true) است یا غلط (false).
به عبارت دیگر، اگر میخواهید بررسی کنید که یک مقدار مشخص، شرطی را برآورده میکند یا خیر، Predicate ابزار مناسب و هدفمند شماست.
Func
Func یک Delegate عمومیتر است که میتواند:
-
چندین پارامتر ورودی داشته باشد.
-
خروجی از هر نوع دادهای باشد، نه فقط bool.
به همین دلیل، Func انعطاف بیشتری دارد و برای انواع محاسبات و تبدیلها کاربرد دارد.
مثال ساده برای Func
Func<int, bool> isEven = x => x % 2 == 0;
در این مثال، تابع بررسی میکند که یک عدد زوج است یا نه. همانطور که میبینید، در عمل این Func<int, bool> همان کاری را انجام میدهد که یک Predicate<int> انجام میدهد.
تفاوت اصلی در خوانایی و هدفمندی کد است.
استفاده از Predicate به برنامهنویس و خوانندهی کد نشان میدهد که هدف از این Delegate بررسی یک شرط منطقی است، نه انجام محاسبات پیچیده یا تولید دادههای مختلف.
کاربردهای واقعی Predicate در پروژههای بزرگ
در پروژههای Enterprise، Predicate ابزار بسیار قدرتمندی است و در سناریوهای مختلف میتواند کد را سادهتر، خواناتر و انعطافپذیرتر کند.
یکی از رایجترین کاربردهای آن، فیلتر کردن دادهها در لایهی Repository است.
مثال در معماری لایهای
فرض کنید یک Repository برای محصولات دارید و میخواهید بتوانید محصولات را بر اساس شرایط مختلف فیلتر کنید:
public List<Product> GetProducts(Predicate<Product> filter)
{
return _products.FindAll(filter);
}
با این روش، متد `GetProducts` میتواند هر نوع شرط دلخواه را بپذیرد و نیازی به نوشتن متدهای متعدد برای هر نوع فیلتر ندارید.
بهترین روشها برای استفاده از Predicate
برای استفاده بهتر و مؤثر از Predicate در پروژههای واقعی، این نکات را رعایت کنید:
استفاده از Lambda Expression
به جای نوشتن متدهای جداگانه، از Lambda برای تعریف سریع و خوانای شرطها استفاده کنید.
نگهداری Predicateها در کلاسهای جداگانه
با قرار دادن Predicateها در کلاس مخصوص، میتوانید آنها را دوباره استفاده کرده و کد را سازماندهی کنید.
نامگذاری واضح و گویا
اسم Predicate باید هدف و شرطی که بررسی میکند را به روشنی نشان دهد، مثلاً IsProductInStock.
انتقال منطق پیچیده به متدهای جداگانه
اگر شرطها طولانی یا پیچیده هستند، آنها را به متدهای مستقل منتقل کنید تا کد خواناتر و تستپذیر باقی بماند.

اشتباهات رایج در استفاده از Predicate
نکاتی که برنامهنویسان تازهکار اغلب نادیده میگیرند
بسیاری از برنامهنویسان تازهکار هنگام استفاده از Predicate مرتکب اشتباهاتی میشوند که هم باعث پیچیدگی کد و هم کاهش کارایی میشود:
-
نوشتن شرطهای بسیار پیچیده داخل Lambda
-
استفاده از Predicate به جای Expression در پروژههای دیتابیسی
-
ترکیب بیش از حد منطق داخل یک Predicate
پرسشهای Predicate در سی شارپ
Predicate .1 چیست؟
Predicate یک Delegate جنریک در سی شارپ است که یک ورودی میگیرد و مقدار bool برمیگرداند.
2. آیا Predicate در پروژههای واقعی کاربرد دارد؟
بله. در فیلتر دادهها، Repository Pattern، اعتبارسنجی فرمها، تستنویسی و سیستمهای جستجو بسیار کاربردی است.

نتیجهگیری
Predicate در سی شارپ یک ابزار ساده اما بسیار قدرتمند است. اگر بهدرستی از آن استفاده کنید:
کد شما تمیزتر میشود
قابلیت تست افزایش پیدا میکند
توسعه و نگهداری آسانتر میشود
منطق شرطی ماژولار میشود
در پروژههای مهم، تسلط بر Predicate یکی از نشانههای درک عمیق شما از Delegateها و طراحی تمیز کد است.
دوره های مرتبط
آموزش برنامه نویسی سی شارپ
زبان شی گرایی حرفه ای سی شارپ یک زبان قدرتمند برای طراحی نرم افزار به شمار میرود.
1,700,000 تومان
آموزش جامع ساخت نرم افزار حسابداری و انبارداری
سیستم حسابداری و انبارداری یکی از ابزارهای مهم برای سازمانها و شرکتها است که فرایند های عملیاتی را بهبود و افزایش می دهد.








