در این بخش درباره عملگرهای استانداردی که در LINQ برای ایجاد کوئری ها می تونیم از اونها استفاده کنیم صحبت خواهیم کرد. در بخش های قبلی با یکی از این عملگر ها به نام where آشنا شدیم که وظیفه فیل تر سازی اطلاعات در کوئری های LINQ رو داره. در این بخش به طور مفصل در باره تک تک این عملگرها بحث خواهیم کرد.

کلا" دو دسته از عملگرهای استاندارد در LINQ وجود دارند، اپراتورهای استانداری که بر روش اشیاء ای از نوع اینترفیس
کد زیر مثالی در باره استفاده از عملگرهای استاندارد LINQ است:

  کد:
string myStr = "This text is only for test";
string[] words = myStr.Split(' ');


var query = from word in words
            group word.ToLower() by word.Length into gr
            orderby gr.Key
            select new { Length = gr.Key, Words = gr };
foreach (var obj in query)
{
    Console.WriteLine(obj.Length);
    foreach (string word in obj.Words)
    {
        Console.WriteLine(word);
    }
}


در کد بالا، ابتدا رشته ای تعریف شده و کلمات رشته داخل یک آرایه قرار میگیرند. سپس با یک کوئری LINQ کلمات به ترتیب طول مرتب شده و دسته بندی می شن، بعد از دسته بندی حروف با یک دستور foreach مقادیر خروجی نمایش داده می شن. عملگرهایی که در بالا استفاده شده است، یکی عملگر group by برای دسته بندی خروجی و یکی هم عملگر orderby برای مرتب سازی خروجی می باشد. خروجی کد بالا به صورت زیر خواهد بود:

  کد:
2
is
3
for
4
this
text
only
test


در ادامه به بررسی هر یک از عملگرهای LINQ خواهیم پرداخت:

1. عملگرهای مرتب سازی :: اولین دسته از عملگرهایی که بررسی خواهیم کردیم مربوط به مرتب سازی خروجی کوئری می باشد. این عملگرها عبارتند از:

OrderBy: که عملیات مرتب سازی لیست به صورت صعودی را انجام می دهد. (LINQ Syntax = orderby)
OrderByDescending: عملیات مرتب سازی لیست به صورت نزولی را انجام می دهد. (LINQ Syntax = orderby -- descending)
ThenBy: عملیات مربت سازی ثانویه را به صورت صعودی انجام می دهد (--,-- LINQ Syntax = orderby)
ThenByDescending: عملیات مرتب سازی ثانویه به صورت نزولی انجام می دهد (LINQ Syntax = orderby --,-- descending)
Reverse: ترتیب خروج کوئری را برعکس می کند (این عملگر معادلی در ساختار LINQ ندارد)

در ادامه با ارائه یک مثال با هر یک از عملگر های بالا بیشتر آشنا خواهیم شد. (مثال هم به صورت کوئری های LINQ و هم با استفاده از متدهای موجود زده خواهند شد)

استفاده از عملگر OrderBy:

  کد:
int[] numbers = { 4, 1, 6, 5, 2, 8, 3, 7, 9 };

IEnumerable<int> query = from n in numbers
                         orderby n
                         select n;

IEnumerable<int> query2 = numbers.OrderBy(n => n);  // query using OrderBy extention method

foreach (int number in query)
    Console.WriteLine(number);

output:
1
2
3
4
5
6
7
8
9


استفاده از عملگر OrderByDescending:

  کد:
int[] numbers = { 4, 1, 6, 5, 2, 8, 3, 7, 9 };

IEnumerable<int> query = from n in numbers
                         orderby n descending
                         select n;

IEnumerable<int> query2 = numbers.OrderByDescending(n => n);

foreach (int number in query)
    Console.WriteLine(number);

output:
9
8
7
6
5
4
3
2
1


استفاده از عملگر ThenBy: (برای مثال این بخش از کلاس Person که در بخش اول نوشتیم استفاده می کنیم)

  کد:
List persons = new List()
{
    new Person() { FirstName = "Hosein", LastName = "Ahmadi", Age = 23 },
    new Person() { FirstName = "Hamid", LastName = "Asgari", Age = 27 },
    new Person() { FirstName = "Reza", LastName = "Karimi", Age = 42 },
    new Person() { FirstName = "Mohammad", LastName = "Zamani", Age = 31 },
    new Person() { FirstName = "Reza", LastName = "Ahmadi", Age = 26 },
    new Person() { FirstName = "Ali", LastName = "Kiani", Age = 17 },
    new Person() { FirstName = "Saman", LastName = "Skandari", Age = 25 },
    new Person() { FirstName = "Karim", LastName = "Heydari", Age = 19 }
};

var query = from p in persons
            orderby p.FirstName, p.Age
            select p;

var query2 = persons.OrderBy(n => n.FirstName).ThenBy(n => n.Age);

foreach (Person p in query2)
{
    Console.WriteLine(p.ToString());
    Console.WriteLine("--------------------");
}

output:
FirstName: Ali
LastName: Kiani
Age: 17
--------------------
FirstName: Hamid
LastName: Asgari
Age: 27
--------------------
FirstName: Hosein
LastName: Ahmadi
Age: 23
--------------------
FirstName: Karim
LastName: Heydari
Age: 19
--------------------
FirstName: Mohammad
LastName: Zamani
Age: 31
--------------------
FirstName: Reza
LastName: Ahmadi
Age: 26
--------------------
FirstName: Reza
LastName: Karimi
Age: 42
--------------------
FirstName: Saman
LastName: Skandari
Age: 25
--------------------


ThenByDescending:

  کد:
List persons = new List()
{
    new Person() { FirstName = "Hosein", LastName = "Ahmadi", Age = 23 },
    new Person() { FirstName = "Hamid", LastName = "Asgari", Age = 27 },
    new Person() { FirstName = "Reza", LastName = "Karimi", Age = 42 },
    new Person() { FirstName = "Mohammad", LastName = "Zamani", Age = 31 },
    new Person() { FirstName = "Reza", LastName = "Ahmadi", Age = 26 },
    new Person() { FirstName = "Ali", LastName = "Kiani", Age = 17 },
    new Person() { FirstName = "Saman", LastName = "Skandari", Age = 25 },
    new Person() { FirstName = "Karim", LastName = "Heydari", Age = 19 }
};

var query = from p in persons
            orderby p.FirstName ascending, p.Age descending
            select p;

var query2 = persons.OrderBy(n => n.FirstName).ThenByDescending(n => n.Age);

foreach (Person p in query)
{
    Console.WriteLine(p.ToString());
    Console.WriteLine("--------------------");
}


Reverse:

  کد:
int[] numbers = { 4, 1, 7, 5, 3, 8, 2, 9 };

List<int> query = numbers.Reverse().ToList();

query.ForEach(n => Console.WriteLine(n));

9
2
8
3
5
7
1
4


عملگرهایی که در بالا در موردشان صحبت کردیم برای مرتب سازی نتایج کوئری ها استفاده می شوند. در بخش بعدی در مورد عملگر های مجموعه ای (Set Operators) صحبت خواهیم کرد.

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

Distinct: جهت حذف المان های تکراری در یک مجموعه استفاده می شود (معادل در کوئری های LINQ ندارد)
Except: المان های تکراری دو مجموعه حذف شده و تنها المان های غیر تکراری در نتیجه ظاهر می شوند (معادل LINQ ندارد)
Intersect: خروجی حاوی اشتراک دو مجموعه خواهد بود (معادل LINQ ندارد)
Union: خروجی حاوب اجتماع دو محموعه خواهد بود.

در زیر با ارئه مثال های گوناگون با کاربرد هر یک از عملگرها آشنا خواهیم شد.

Distinct:

  کد:
int[] set1 = { 4, 1, 7, 5, 2, 8, 6, 4, 5, 1, 8, 9 };

var query = set1.Distinct();

foreach (int i in query)
    Console.WriteLine(i);

output:
4
1
7
5
2
8
6
9


Except:

  کد:
int[] set1 = { 3, 6, 1, 2, 7, 8 };
int[] set2 = { 5, 2, 3, 7, 6 };

var query = set1.Except(set2);

foreach (int i in query)
    Console.WriteLine(i);

output:
1
8


Intersect:

  کد:
int[] set1 = { 3, 6, 1, 2, 7, 8 };
int[] set2 = { 5, 2, 3, 7, 6 };

var query = set1.Intersect(set2);

foreach (int i in query)
    Console.WriteLine(i);

out:
3
6
2
7


Union:

  کد:
int[] set1 = { 3, 6, 1, 2, 7, 8 };
int[] set2 = { 5, 2, 3, 7, 6 };

var query = set1.Union(set2);

foreach (int i in query)
    Console.WriteLine(i);

output:
3
6
1
2
7
8
5


3. عملگرهای فیل تر کردن اطلاعات :: عملگرهای بعدی که در مورد آنها صحبت خواهیم کرد برای فیل تر کردن اطلاعات به کار می روند. دو نوع عملگر برای اینکار وجود دارد:

1. OfType: در داخل یک مجموعه تنها عناصری از یک نوع خاص را بر می گرداند (معادل LINQ ندارد)
2. Where: عملیات فیل ترینگ را بر اساس شرطی خاص بر میگرداند.

OfType: برای آشنایی بیشتر با این متد مثالی با استفاده از یک ArrayList خواهیم زد، ArrayList شئ ایست که می تواند هر نوع داده ای را در خود ذخیره کند. حال اگر ما بخواهیم از داخل یک ArrayList که حاوی چندین نوع می باشد، یک نوع خاص را استخراج کنیم می توانیم از این عملگر استفاده کنیم:

  کد:
ArrayList list = new ArrayList() { 2, 7, "A", 'C', 2.7, 4, "D" };

IEnumerable<int> query1 = list.OfType<int>();
IEnumerable<string> query2 = list.OfType<string>();

foreach (int i in query1)
    Console.WriteLine(i);
foreach (string s in query2)
    Console.WriteLine(s);

output:
2
7
4
A
D


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

  کد:
string[] s = { "Hello LINQ!", "Hello C#!", "LINQ is very flexible","Hello Generics!"};

IEnumerable<string> query = from w in s
                            where w.ToLower().Contains("linq")
                            select w;
foreach (string linq in query)
    Console.WriteLine(linq);

output:
Hello LINQ!
LINQ is very flexible


در این مقاله در مورد سه گروه از عملگر های استاندارد صحبت کردیم، عملگرهای مرتب سازی، عملگرهای مجموعه ای و عملگرهای فیل تر سازی. به دلیل حجم زیاد این عملگرها، در طول چند بخش در مورد عملگرها صحبت خواهم کرد. در بخش بعدی در مورد عملگرهای Quantifier، عملگرهای Projection و عملگرهای Partitioning صحبت خواهیم کرد.

موفق باشید.