متدهای توسعه یافته 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 باشد، مقدار صفر را بر می گرداند.
Listlist = 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 می باشد .
Listlist = 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
به علت وجود فاصله بین = , < برنامه error میگیرد
با سلامدر درمتد ToDictionary عبارت
var animals = list.ToDictionary(x = > x, x => true);
به صورت زیر تصحیح گردد
var animals = list.ToDictionary(x => x, x => true);