عملگرهای مرتب سازی در Linq بخش سوم

در مقاله قبل ، کلاس های Product و ProductRepository را تعریف کردیم . اکنون در این مقاله می خواهیم مثال سوم را بیان کنیم .

مثال سوم :

میخواهیم تمام محصولات را از انبار گرفته و آنها را بر اساس نامشان مرتب کنیم :

                              
public static void OrderBy_Sample3()
{
    var products = new ProductRepository().GetAll();
    var sortedProducts =
                        from product in products
                        orderby product.ProductName
                        select product;
    foreach (var product in sortedProducts)
    {
        Console.WriteLine("ID: {0}\tName: {1}", product.ProductID, product.ProductName);
    }
}

توضیح : ابتدا با فراخوانی متد GetAll ، تمام محصولات موجود در انبار محصولات را بیرون کشیدیم و سپس توسط دستور orderby ، آنها را براساس نامشان مرتب کرده و در متغیر sortedProducts ریخته و در نهایت در یک حلقه foreach ، تک تک آنها را به خروجی می دهیم .

مدل مقایسه ای دلخواه در دستور OrderBy :

برای اینکه روش دلخواه خود را برای مقایسه و sorting به دستور orderby اعمال کنیم ، باید اولا از دستور orderby بصورت Extension Method استفاده کنیم ، دوما مدل مقایسه ای دلخواه خود را تعریف کنیم .

مثال چهارم :

در این مثال ما میخواهیم کلمات واقع در یک آرایه بصورت CaseInsensitive (یعنی غیر حساس به حروف بزرگ و کوچک انگلیسی) با هم مقایسه و سورت شوند .

نکته : پیش فرض مقایسه کلمات در زبانهای برنامه نویسی ، CaseSensitive می باشد .

آرایه ای از رشته ها بصورت زیر داریم :

                              
   string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" };

نحوه استفاده از دستور orderby بصورت extensionMethod برای مقایسه دلخواه بصورت زیر است :

                              
   var sortedWords = words.OrderBy(word => word, new CaseInsensitiveComparer());

حال باید کلاس CaseInsensitiveComparer را پیاده سازی کنیم :

بدین منظور کلاسی به همین نام در پروژه خود ایجاد کنید و کدهای زیر را در آن تعریف کنید :

                              
public class CaseInsensitiveComparer : IComparer
{
    public int Compare(string x, string y)
    {
        return string.Compare(x, y, StringComparison.OrdinalIgnoreCase);
    }
}

متد Compare یکی از سه خروجی -۱ , ۰ , ۱ را برمیگرداند :

  • اگر اولی از دومی بزرگتر باشد ۱ برمیگرداند .
  • اگر اولی با دومی برابر باشد ۰ برمیگرداند .
  • و اگر دومی از اولی بزرگتر باشد ۱- برمیگرداند .

بنابراین کد مثال ۴ بطور کلی بصورت زیر شده است :

                              
public static void OrderByComparer()
{
    string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" };
    var sortedWords = words.OrderBy(word => word, new CaseInsensitiveComparer());
    foreach (var word in sortedWords)
    {
        Console.WriteLine(word);
    }
}

مثال پنجم :

برای سورت بصورت نزولی مثال زیر را داریم :

                              
public static void OrderByDescendingSimple1()
{
    double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };
    var sortedDoubles =
                        from number in doubles
                        orderby number descending
                        select number;
    Console.WriteLine("The doubles from highest to lowest:\n————————-");
    foreach (var number in sortedDoubles)
    {
        Console.WriteLine(number);
    }
}

همانطور که مشاهده می کنید ، تنها تفاوت سورت نزولی با صعودی (پیش فرض) استفاده از عبارت descending می باشد .

مقاله سوم از مبحث مرتب سازی در Linq به پایان رسید . در مقاله بعد سراغ مثال های دیگری از این مبحث مهم خواهیم رفت . پس با ما باشید .


تاریخ انتشار : ۲۶ اسفند ۱۳۹۴



دیدگاه ها :