آموزش LinQ – بخش ۳ – عملگرهای مختلف
آموزش LinQ - بخش 3 - عملگرهای مختلف » در این مقاله، عملگرهای تبدیل، المنت، تولید، شمارنده و تجمیع را بررسی خواهیم کرد. مانند: max و count و first و average

آموزش LinQ – بخش ۳ – عملگرهای مختلف

LinQ Tutorial – Part 3 – Various Operators

 

در مقالات قبل ، عملگرهای مجموعه ای (Set) و مرتب سازی (Ordering) را بررسی کردیم . در این بخش می خواهیم عملگرهای زیر را مورد بررسی و تحلیل قرار دهیم:

  • عملگرهای تبدیل یا Coversion مانند ToArray و ToDictionary و ToList
  • عملگرهای المنت یا Element مانند First و FirstOrDefault و ElementAt
  • عملگرهای تولید یا Generation مانند Repeat و Range
  • عملگرهای شمارنده یا Quantifier مانند Any و All
  • عملگرهای تجمیع یا Aggregation مانند Count و Min و Max و Average و Sum

 

 عملگرهای تبدیل – Conversion Operators 

 

دستور ToArray :

برای تبدیل به آرایه بکار میرود . به مثال زیر توجه کنید :

                              
public static void ToArray()
{
    double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };
    var sortedDoubles =
                        from number in doubles
                        orderby number descending
                        select number;
    var doublesArray = sortedDoubles.ToArray();
    Console.WriteLine("Every other double from highest to lowest:\n————————");
    for (int index = 0; index < doublesArray.Length; index += 2)
    {
        Console.WriteLine(doublesArray[index]);
    }
}

 

دستور ToList :

برای تبدیل به لیست Generic از نوع موردنظر بکار میرود . به مثال زیر دقت کنید :

                              
public static void ToList()
{
    string[] words = { "cherry", "apple", "blueberry" };
    var sortedWords =
                        from word in words
                        orderby word
                        select word;
 
    var wordList = sortedWords.ToList();
    Console.WriteLine("The sorted word list:\n—————————");
    foreach (var word in wordList)
    {
        Console.WriteLine(word);
    }
}

 

عملگر ToDictionary :

برای تبدیل به دیکشنری بکار میرود . همانطور که می دانید نوع Dictionary دارای دو پارامتر کلید-مقدار (key-value) می باشد . نکته ای که در تبدیل به Dictionary وجود دارد اینست که باید کلید دیکشنری را به صراحت ارائه دهیم . برای روشن شدن مطلب به مثال زیر دقت کنید :

                              
public static void ToDictionary()
{
    var scoreRecords = new[]
    {
        new {Name = "Alice", Score = 50},
        new {Name = "Bob"  , Score = 40},
        new {Name = "Cathy", Score = 45}
    };
    var scoreRecordsDict = scoreRecords.ToDictionary(sr => sr.Name);
    Console.WriteLine("Bob's score: {0}", scoreRecordsDict[“Bob”]);
}

توضیح : در مثال فوق ، عبارت Name بعنوان کلید دیکشنری معرفی شده است و Score مقدار آنست.

 

عملگر ofType :

برای اعمال فیلترینگ روی مجموعه هایی که دارای عناصر همگن نیستند (یعنی دارای نوع های مختلف مانند int , string , double , … می باشند) برای مثال داریم :

                              
public static void OfType()
{
    object[] numbers = { null, 1.0, "two", 3, "four", 5, "six", 7.0 };
    var doubles = numbers.OfType();
    Console.WriteLine("Numbers stored as doubles:\n--------------------------------");
    foreach (var number in doubles)
    {
        Console.WriteLine(number);
    }
}

توضیح : در مثال فوق ، می خواهیم عناصری را که از نوع double هستند را به خروجی بدهیم .

 

 عملگرهای المنت – Element Operators 

 

عملگرهای المنت به آنهایی گفته می شوند که یک عنصر را بعنوان خروجی برمیگردانند . مثلا در یک مجموعه می خواهیم یک آیتم خاص را با شرطی خاص برگردانیم مثلا کاربری که ID آن برابر ۲۱۰ می باشد .

 

عملگر First :

در پایان یک query می توان از First استفاده کنیم . اگر query بدرستی اجرا شود و آیتم موردنظر را نیز برگرداند ، اولین آیتم را به عنوان خروجی در نظر می گیرد .

مثال اول:

                              
public static void FirstSimple()
{
    var products = new ProductRepository().GetAll();
    Product product12 = (
                            from product in products
                            where product.ProductID == 12
                            select product
                        ).First();
    Console.WriteLine("ID: {0}\tName: {1}\tCategory: {2}", product12.ProductID, product12.ProductName, product12.Category);
}

مثال دوم:

در مثال دوم از First شرطی استفاده می کنیم :

                              
{
    string[] strings = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
    string startsWithO = strings.First(s => s[0] == 'o');
    Console.WriteLine("A string starting with 'o': {0}", startsWithO);
}

گفتیم که اولین رشته ای را برگردان که با حرف o شروع شود .

نکته مهم : کار با عملگر First خطرناک می باشد ! بدین معنی که اگر query آیتمی برنگرداند ، برنامه در run time دچار خطا می شود . بنابراین فقط در مواقعی باید از First استفاده کنیم که مطمئن باشیم query ما حتما یک خروجی دارد .

برای رفع مشکل فوق  ، از دات نت ورژن ۳٫۵ به بعد ، عملگر FirstOrDefault تعریف شد .

 

عملگر FirstOrDefault :

اگر رشته پرس و جوی ما نتیجه ای برنگرداند (مانند مثال زیر) در صورتی که از FirstOrDefault استفاده کرده باشیم ، با خطای runtime مواجه نمی شویم :

                              
public static void FirstOrDefaultSimple()
{
    int[] numbers = { };
    int firstNumOrDefault = numbers.FirstOrDefault();
    Console.WriteLine(firstNumOrDefault);
}

خروجی مثال فوق برابر صفر می باشد . (زیرا پیش فرض int صفر می باشد)

 

FirstOrDefault شرطی :

در مثال دوم از این عملگر ، شرط مورد نظر را روی خود عملگر پیاده می کنیم :

                              
public static void FirstOrDefaultCondition()
{
    var products = new ProductRepository().GetAll();
    Product product789 = products.FirstOrDefault(p => p.ProductID == 789);
    Console.WriteLine("Product 789 exists: {0}", product789 != null);
}

 

عملگر ElementAt :

در مواردی که می دانیم آیتم موردنظرمان در کدام ایندکس وجود دارد ، از این دستور استفاده میکنیم . ایندکس از صفر شروع می شود . به مثال زیر دقت کنید :

                              
public static void ElementAt()
{
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
    int fourthLowNum = (
                            from number in numbers
                            where number > 5
                            select number
                        ).ElementAt(1);  // second number is index 1 because sequences use 0-based indexing
    Console.WriteLine("Second number > 5: {0}", fourthLowNum);
}

توضیح : خروجی مثال فوق ، عدد ۸ می باشد .

 

 عملگرهای تولید – Generation Operators 

 

بر خلاف عملگرهایی که تا کنون بررسی کردیم ، Generation Operator ها ، برای تولید مجموعه بکار میروند . دو تا عملگر دارد . بنام های Range و Repeat .

 

عملگر Range :

با یک مثال این عملگر را توضیح می دهیم :

                              
public static void Range()
{
    var numbers =
                    from number in Enumerable.Range(100, 50)
                    select new { Number = number, OddEven = number % 2 == 1 ? "odd" : "even" };
    foreach (var number in numbers)
    {
        Console.WriteLine("The number {0} is {1}.", number.Number, number.OddEven);
    }
}

توضیح : توسط دستور Range(100,50) گفتیم که از عدد ۱۰۰ تا ۵۰ عدد بعد از آن در محدوده تعریفی ما قرار میگیرد . یعنی اعداد ۱۰۰ تا ۱۴۹ . در دستور select new دو متغیر جدید بنامهای Number و OddEven تعریف کردیم که Number همان عدد است و OddEven یکی از مقادیر Odd یا Even می باشد . یعنی اعداد زوج و فرد بین ۱۰۰ تا ۱۴۹ رامشخص کرده و در حلقه foreach نمایش می دهیم .

 

عملگر Repeat :

برای تکرار عنصر دلخواه ما به تعداد دلخواه . دو پارامتر می گیرد که اولی مقدار تکرارشونده دلخواه ما می باشد و دومی تعداد تکرار شدن آن :

                              
public static void Repeat()
{
    var numbers = Enumerable.Repeat("Mohtava.info", 10);
    foreach (var number in numbers)
    {
        Console.WriteLine(number);
    }
}

در خروجی تابع فوق ، عبارت Mohtava.info به تعداد ۱۰ بار تکرار می شود .

 

 عملگرهای کمیت سنج یا  Quantifier Operators 

 

برای بررسی اینکه یک آیتم در مجموعه موردنظر ما وجود دارد یا خیر و یا یک شرطی روی مجموعه ما صادق هست یا خیر . دو تا عملگر در این زمینه وجود دارد به نام های Any و All . نوع خروجی اینها همیشه True , False می باشد .

 

عملگر Any :

با یک مثال ، این عملگر را توضیح خواهیم داد :

                              
public static void AnySmiple()
{
    string[] words = { "believe", "relief", "receipt", "field" };
    bool iAfterE = words.Any(word => word.Contains("ei"));
    Console.WriteLine("There is a word that contains in the list that contains 'ei': {0}", iAfterE);
}

توضیح : توسط Any بررسی کرده ایم که آیا آیتمی در مجموعه ما وجود دارد که شامل حروف ei باشد . خروجی آن true می باشد زیرا کلمه receipt مشمول این شرط می شود .

 

عملگر All :

به مثال زیر توجه کنید :

                              
public static void AllSimple()
{
    int[] numbers = { 1, 11, 3, 19, 41, 65, 19 };
    bool onlyOdd = numbers.All(number => number % 2 == 1);
    Console.WriteLine("The list contains only odd numbers: {0}", onlyOdd);
}

توضیح : توسط All بررسی کردیم که شرط ما روی تمام آیتمها مطابقت می کند یا خیر .

 

 عملگرهای تجمیع یا Aggregation Operators 

 

کلمه Aggregation به معنی تجمیع می باشد و کارش به این صورت است که با در نظر گرفتن یک متغیر و یک اشاره گر ، روی collection موردنظر حرکت می کند و مقادیری مانند sum , count , max , min و غیره را برمیگرداند .

 

عملگر Count :

همانطور که از اسمش مشخص است ، تعداد اعضای یک کالکشن را برمیگرداند . در واقع اشاره گر مذکور با گذر از روی هر یک از آیتم های کالکشن ، یک واحد به count اضافه می کند . مثال زیر را مشاهده کنید :

                              
public static void CountSimple()
{
    int[] factorsOf300 = { 2, 2, 3, 5, 5 };
    int uniqueFactors = factorsOf300.Distinct().Count();
    Console.WriteLine("There are {0} unique factors of 300.", uniqueFactors);
}

توضیح : توسط عملگرهای Distinct , Count توانستیم تعداد اعداد یکتای مجموعه را برگردانیم که در این مثال خروجی برابر عدد ۳ می باشد (اعداد ۲و۳و۵)

 

عملگر Count شرطی :

میخواهیم ابتدا شرط دلخواه خود را روی مجموعه بررسی کنیم و سپس تعداد آیتم های واقع در مجموعه جواب بدست آمده را به خروجی بدهیم :

                              
public static void CountConditional()
{
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
    int oddNumbers = numbers.Count(number => number % 2 == 1);
    Console.WriteLine("There are {0} odd numbers in the list.", oddNumbers);
}

در مثال فوق ، تعداد اعداد فرد واقع در آرایه int را بعنوان خروجی دریافت می کنیم .

 

عملگر Count تو در تو (Nested) :

در مثال زیر می خواهیم از جدول Customer آیدی هر مشتری بعلاوه تعداد سفارشات هر مشتری را به خروجی بدهیم .

                              
public static void CountNested()
{
    var customers = new CustomerRepository().GetAll();
    var orderCounts =
                        from customer in customers
                        select new { customer.CustomerID, OrderCount = customer.Orders.Count() };
    Console.WriteLine("Customer orders:\n————————–");
    foreach (var customer in orderCounts)
    {
        Console.WriteLine("Customer: {0}\tOrders Count: {1}", customer.CustomerID, customer.OrderCount);
    }
}

 

عملگر Sum :

برای عمل جمع کردن روی کالکشن موردنظر بکار میرود . در مثال زیر می خواهیم مجموع اعداد واقع در مجموعه را بدست آوریم :

                              
public static void SumSimple()
{
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
    double numbersSum = numbers.Sum();
    Console.WriteLine("The sum of the numbers is {0}.", numbersSum);
}

در مثال زیر می خواهیم تعداد کل کاراکتر های کلمات واقع در آرایه را بدست آوریم . بدین صورت که طول هر یک از رشته ها را با هم جمع می کنیم :

                              
public static void SumProjection()
{
    string[] words = { "cherry", "apple", "blueberry" };
    double totalChars = words.Sum(word => word.Length);
    Console.WriteLine("There are a total of {0} characters in these words.", totalChars);
}

 

عملگر Min :

برای مینیمم گرفتن از آیتم های مجموعه بکار میرود . مثال ساده زیر را مشاهده کنید :

                              
public static void MinSimple()
{
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
    int minNum = numbers.Min();
    Console.WriteLine("The minimum number is {0}.", minNum);
}

در مثال زیر می خواهیم تعداد کاراکترهای کوتاه ترین کلمه را بدست آوریم . بدین صورت که طول هر یک از رشته ها را بدست می آوریم و سپس مینیمم این مجموعه را به خروجی می دهیم :

                              
public static void MinProjection()
{
    string[] words = { "cherry", "apple", "blueberry" };
    int shortestWord = words.Min(word => word.Length);
    Console.WriteLine("The shortest word is {0} characters long.", shortestWord);
}

 

عملگر Max :

مقدار ماکزیمم را از مجموعه موردنظر برمیگرداند . به مثال زیر توجه کنید :

                              
public static void MaxSimple()
{
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
    int maxNumber = numbers.Max();
    Console.WriteLine("The maximum number is {0}.", maxNumber);
}

در مثال دوم میخواهیم تعداد حرفهای طولانی ترین کلمه در آرایه رشته ای را بدست آوریم :

                              
public static void MaxProjection()
{
    string[] words = { "cherry", "apple", "blueberry" };
    int longestLength = words.Max(word => word.Length);
    Console.WriteLine("The longest word is {0} characters long.", longestLength);
}

 

عملگر Average :

برای معدل گیری از مجموعه ها بکار میرود . بعنوان مثال می خواهیم میانگین مجموعه عددی را بدست آوریم :

                              
public static void AverageSimple()
{
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
    double averageNumber = numbers.Average();
    Console.WriteLine("The average number is {0}.", averageNumber);
}

در مثال دوم می خواهیم میانگین تعداد کاراکترهای کلمات آرایه را برگردانیم :

                              
public static void AverageProjection()
{
    string[] words = { "cherry", "apple", "blueberry" };
    double averageLength = words.Average(word => word.Length);
    Console.WriteLine("The average word length is {0} characters.", averageLength);
}

» در صورت نیاز به تکمیل دانش خود در زمینه عملگرهای تجمیع (aggregation) مطالعه مقاله "Aggregate Operators – LINQ to DataSet" توصیه می شود.

مباحث این جلسه در اینجا به پایان می رسد. در جلسه چهارم (پایانی) از سری آموزشی LinQ سایر عملگرهای Linq را معرفی خواهیم کرد.


برچسب‌ها:

آموزش Linqتبدیل به آرایهعملگرهای المنتعملگرهای تبدیلعملگرهای تبدیل در Linqعملگرهای تجمیععملگرهای تولیدعملگرهای کمیت سنج

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

12 + 12 =