متدهای توسعه یافته LINQ با مثال

کلمه کلیدی ascending

عناصر یک مجموعه را به صورت صعودی مرتب می کند.

int[] number = { 7, 2, 5, 4, 6 };

var result = from num in number
    orderby num ascending
    select num;

foreach (var n in result)
{
    Console.WriteLine(n);
}
2
4
5
6
7

کلمه کلیدی descending

عناصر یک مجموعه را به صورت نزولی مرتب می کند.

int[] number = { 7, 2, 5, 4, 6 };

var result = from num in number
    orderby num descending
    select num;

foreach (var n in result)
{
    Console.WriteLine(n);
}
7
6
5
4
2

ToArray

این متد عناصر یک نوع IEnumerable را به آرایه تبدیل می کند :

int[] array1 = { 5, 4, 1, 2, 3 };

var query = from element in array1
            orderby element
            select  element;

int[] array2 = query.ToArray();

foreach (int value in array2)
{
    Console.WriteLine(value);
}
1
2
3
4
5

متد ToDictionary

این متد لیست داده شده را به نوع Dictionary<Tkey,TValue> تبدیل می کند:

List<string> list = new List<string>()
{
	"cat",
	"dog",
	"animal"
};

var animals = list.ToDictionary(x => x, x => true);
if (animals.ContainsKey("dog"))
{
    Console.WriteLine("dog exists");
}
dog exists

متد ToList

مجموعه موجود از نوع  IEnumerable<T> را به نوع  List<T> تبدیل می کند:

string[] array = new string[]
{
	"A",
	"B",
	"C",
	"D"
};

List<string> list = array.ToList();

Console.WriteLine(list.Count);
foreach (string valuein list)
{
    Console.WriteLine(value);
}
4
A
B
C
D

متدToLookup

این متد لیست داده شده را به نوع  Lookup<Tkey,TElement> تبدیل می کند، فرق Lookup با Dictionary در این است که کلاس Lookup از نوع One-To-Many می باشد، یعنی یک کلید می تواند به چندین Element اشاره کنید:

string[] array = { "cat", "dog", "horse" };

var lookup = array.ToLookup(item = > item.Length);

foreach (string itemin lookup[3])
{
    Console.WriteLine("3 = " + item);
}

foreach (string itemin lookup[5])
{
    Console.WriteLine("5 = " + item);
}

foreach (var groupingin lookup)
{
    Console.WriteLine("Grouping:");
    foreach (string itemin grouping)
    {
        Console.WriteLine(item);
    }
}
3 = cat
3 = dog
5 = horse
Grouping:
cat
dog
Grouping:
horse

متد AsEnumerable

از این متد برای تبدیل یک نوع از IEnumerable<T> به نوع دیگری از IEnumerable<T> استفاده می شود. یکی از ویژگی های این عملگر، استفاده از شرط های Where در Table های LINQ to SQL می باشد، زیرا برخی از دستورات NET. داخل شرط های Table ها در LINQ to SQL قابلیت استفاده را ندراد.

int[] array = new int[2];
array[0] = 5;
array[1] = 6;

var query = array.AsEnumerable();
foreach (var element in query)
{
    Console.WriteLine(element);
}
5
6

متد AsParallel

مشخص می کند که پرس و جوهای بعد از این متد باید به صورت Parallel یا موازی اجرا شوند.

static int SumDefault(int[] array)
{
    return array.Sum();
}

static int SumAsParallel(int[] array)
{
    return array.AsParallel().Sum();
}

static void Main()
{
    int[] array = Enumerable.Range(0, short.MaxValue).ToArray();

    Console.WriteLine(SumAsParallel(array));
    Console.WriteLine(SumDefault(array));

    const int m = 10000;
    var s1 = Stopwatch.StartNew();

    for (int i = 0; i < m; i++)
    {
        SumDefault(array);
    }

    s1.Stop();
    var s2 = Stopwatch.StartNew();
    for (int i = 0; i < m; i++)
    {
        SumAsParallel(array);
    }

    s2.Stop();
    Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) / m).ToString("0.00 ns"));
    Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) / m).ToString("0.00 ns"));
    Console.Read();
}

متد Average

برای به دست آوردن میانگین یک سری از اعداد به کار می رود.

double[] array1 = { 1, 2, 3, 5, 0 };
double average1 = array1.Average();
Console.WriteLine(average1);

string[] array2 = { "dog", "cat", "perls" };
double average2 = array2.Average(x => x.Length);
Console.WriteLine(average2);
2.2
3.66666666666667

متد Count

تعداد عناصر یک لیست یا آرایه را بر می گرداند.

int[] array = { 1, 2, 3 };
    Console.WriteLine(array.Count());

List<int> list = new List<int>() { 1, 2, 3 };
    Console.WriteLine(list.Count());

var result = from element in array
                orderby element descending
                select element;

Console.WriteLine(result.Count())
3
3
3

متد Cast

از این متد در مواقعی که بخواهیم عناصر یک لیست را به نوعی دیگر تبدیل کنیم استفاده می شود:

class A
{
    public void Y()
    {
        Console.WriteLine("A.Y");
    }
}

class B : A
{
}

class Program
{
    static void Main(string[] args)
    {
        B[] values = new B[3];
        values[0] = new B();
        values[1] = new B();
        values[2] = new B();

        var result = values.Cast<A>();
        foreach (A value in result)
        {
            value.Y();
        }
    }
}
A.Y
A.Y
A.Y

متد Concat

این متد دو لیست را با یکدیگر ادغام می کند:

int[] array1 = { 1, 3, 5 };
int[] array2 = { 0, 2, 4 };
            
var result1 = array1.Concat(array2);
foreach (int value in result1)
{
    Console.WriteLine(value);
}
Console.WriteLine();

var result2 = array2.Concat(array1);
foreach (int value in result2)
{
    Console.WriteLine(value);
}
1
3
5
0
2
4

0
2
4
1
3
5

متد Contains

این متد تعیین می کند که لیست دارای عضوی برابر با عضو تعیین شده می باشد یا خیر:

var list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

bool a = list.Contains<int>(7);

bool b = list.Contains(7);

Console.WriteLine(a);
Console.WriteLine(b);
True
True

متد DefaultIfEmpty

اگر یک مجموعه تهی باشد، مقدار پیشفرض مربوط به مجموعه را بر می گرداند. مثلا اگر نوع یک مجموعه تهی int باشد، مقدار صفر را بر می گرداند.

List list = new List<int>();

var result = list.DefaultIfEmpty();
foreach (var value in result)
{
    Console.WriteLine(value);
}

result = list.DefaultIfEmpty(-1);
foreach (var value in result)
{
    Console.WriteLine(value);
}
0
-1

متد Distinct

عناصری تکراری از مجموعه را حذف می کند .

int[] array1 = { 1, 2, 2, 3, 4, 4 };

var result = array1.Distinct();

foreach (int value in result)
{
    Console.WriteLine(value);
}
1
2
3
4

متد ElementAtOrDefault

برای به دست آوردن یک عنصر با یک اندیس خاص به کار می رود.

int[] array = { 4, 5, 6 };
int a = array.ElementAtOrDefault(0);
int b = array.ElementAtOrDefault(1);
int c = array.ElementAtOrDefault(-1);
int d = array.ElementAtOrDefault(1000);

Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
4
5
0
0

متد ElementAt

برای به دست آوردن یک عنصر با یک اندیس خاص به کار می رود.

string[] array = { "Dot", "Net", "Perls" };

string a = array.ElementAt(0);
Console.WriteLine(a);
string b = array.ElementAt(1);
Console.WriteLine(b);
string c = array.ElementAt(2);
Console.WriteLine(c);
string d = array.ElementAt(3);
Dot
Net
Perls

متد Except

عناصری از مجوعه اول را بر می گرداند که در مجموعه دوم وجود ندارند .

int[] values1 = { 1, 2, 3, 4 };

int[] values2 = { 1, 2, 5 };

var result = values1.Except(values2);

foreach (var element in result)
{
    Console.WriteLine(element);
}
3
4

متد First

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

int[] numbers = { 9 , 34, 65, 92 , 87, 435, 3, 54, 83, 23, 87, 435, 67, 12 , 19 };

int first = numbers.First();

Console.WriteLine(first); 
9

می توان در متد First شرط هم قرار داد.که برای اینکار نیاز به عبارات lambda داریم. قصد داریم اولین عدد بزرگتر از 80 را در مجموعه بالا پیدا کنیم . برای این کار خواهیم داشت :

int first = numbers.First(number => number > 80);

Console.WriteLine(first);
92

متد FirstOrDefault

همانند متد First می باشد با این تفاوت که اگر مجموعه خالی باشد یک مقدار پیش فرض با توجه به data type مربوطه بر میگرداند.می تواند برای از بین بردن استثناءها مورد استفاده قرار گیرد.

int[] numbers = { };
int first = numbers.FirstOrDefault();
Console.WriteLine(first);
0

با توجه به مطالبی که بیان کردیم خروجی قطعه کد فوق مقدار صفر می باشد.دلیل آن هم این است که مجموعه دارای هیچ عنصری نیست و در این حالت این متد مقدار پیش فرض را با توجه به نوع مقصد بر می گرداند.

متد Last

آخرین عنصر از مجموعه را برمی گرداند.اگر مجموعه دارای هیچ عنصری نباشد باعث ایجاد استثنا خواهد شد.

int[] numbers = { 9, 34, 65, 92, 87, 435, 3, 54, 
                    83, 23, 87, 67, 12, 19 };

int last = numbers.Last();

Console.WriteLine(last);
19

در صورت نیاز به استفاده از فیلتر/شرط ، می توان فیلتر و یا شرط مورد نیاز خود را در پردانتز داخل متد قرار داد ، که در این حالت شرط مورد نظر خود را با توسط از Lambda خواهیم نوشت.

int[]
values = { 1, 2, 3, 4, 5, 6 };
int lastOdd = values.Last(element => element % 2 != 0);
Console.WriteLine(lastOdd);
5

در مثال بالا ابتدا شرط مورد نظر بر روی مجموعه اعمال می شود که فقط عناصری انتخاب می شود که باقیمانده آنها بر عدد 2 نا مساوی صفر باشد(اعداد فرد) و در آخر با استفاده از متد Last آخرین عنصر آنها را که عدد 5 می باشد انتخاب می کند.

متد LastOrDefault

همانند متد Last می باشد با این تفاوت که اگر مجموعه خالی باشد ، یک مقدار پیش فرض با توجه به نوع داده مبداء را بر میگرداند.

string[] fruits = { };
string last = fruits.LastOrDefault();
Console.WriteLine(String.IsNullOrEmpty(last) ? "" : last + "\n");
<string is null or empty>

متد Orderby

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

string[] array = { "the", "glass", "bead", "game" };

var result = array.OrderBy(a => new string(a.ToCharArray().Reverse().ToArray()));

foreach (var itemin result)
{
    Console.WriteLine(item);
}
bead
the
game
glass

متد OrderByDescending

این متد برای مرتب سازی به صورت نزولی مورد استفاده قرار می گیرد ، برعکس OrderBy می باشد .

List list = new List<int>(){1,2,3,4,5,6,7,8,9};

foreach (var item in list.OrderByDescending(x => x))
{
      Console.WriteLine(item);                
}
9 , 8 ,7 ,6 ,5 ,4 ,3 ,2 ,1

متد Single

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

int[] array1 = { 1, 3, 1000, 4, 5 };

int value1 = array1.Single(element => element > 999);

Console.WriteLine(value1);
1000

حالت دوم متد Single زمانی است که مجموعه ما فقط شامل یک عنصر می باشد و آن را برمیگرداند.

int[] array = { 4 };

int value = array.Single();

Console.WriteLine(value);
4

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

int[] array = {4,7}; 
try
{
    int value = array.Single(element => element > 0);
}
catch (Exception ex)
{
    Console.WriteLine(ex.GetType());
}
System.InvalidOperationException

متد SingleOrDefault

همانند متد single می باشد با این تفاوت که اگر هیچ عنصری در مجموعه با شرط ما پیدا نشود و یا مجموعه خالی باشد ، مقدار پیش فرض را با توجه به data type مورد نظر بر می گرداند.

int[] array = { 1, 2, 3 };

int a = array.SingleOrDefault(element => element == 5);
Console.WriteLine(a);

int b = array.SingleOrDefault(element => element == 1);
Console.WriteLine(b);

try
{
    int c = array.SingleOrDefault(element => element >= 1);
}
catch (Exception ex)
{
    Console.WriteLine(ex.GetType());
}
0
1
System.InvalidOperationException

متد Reverse

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

int[] array = { 1, 2, 4 };

var reverse = array.Reverse();

foreach (int value in reverse)
{
    Console.WriteLine(value);
}
4
2
1