عملگرهای انتخاب عنصر Single و SingleOrDefault
در این بخش متدهای Single و SingleOrDefault در زبان کوئری نویسی LINQ را بررسی خواهیم کرد. این متدها دو overload دارند که در زیر مشاهده می کنید:
1 2 3 4 | public static TSource Single<TSource>(this IEnumerable<TSource> source); public static TSource Single<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source); public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); |
همانطور که مشاهده می کنید overload اول هیچ پارامتری ندارد و تنها عنصری که در یک مجموعه قرار دارد را باز می گرداند. اگر هیچ عنصری نباشد و یا تعداد عناصر بیش از یک باشد، متد Single یک Exception ایجاد می کند. در overload دوم می توانیم یک شرط هم به این متد ارسال کنیم تا تنها عنصری که این شرط را برآورده می کند را باز گرداند. اگر بیش از یک عنصر آن شرط را برآورده کنند یا هیچ کدام آن را برآورده نکنند، متد Single یک Exception ایجاد می کند. متد SingleOrDefault هم مشابه Single عمل می کند با این تفاوت که اگر هیچ عنصری پیدا نکند، مقدار پیش فرض را باز می گرداند. برای درک بهتر نحوه عملکرد این متدها به مثال زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | IList<int> oneElementList = new List<int>() { 7 }; IList<int> intList = new List<int>() { 7, 10, 21, 30, 45, 50, 87 }; IList<string> strList = new List<string>() { null, "Two", "Three", "Four", "Five" }; IList<string> emptyList = new List<string>(); Console.WriteLine("The only element in oneElementList: {0}", oneElementList.Single()); Console.WriteLine("The only element in oneElementList: {0}", oneElementList.SingleOrDefault()); Console.WriteLine("Element in emptyList: {0}", emptyList.SingleOrDefault()); Console.WriteLine("The only element which is less than 10 in intList: {0}", intList.Single(i => i < 10)); //Followings throw an exception //Console.WriteLine("The only Element in intList: {0}", intList.Single()); //Console.WriteLine("The only Element in intList: {0}", intList.SingleOrDefault()); //Console.WriteLine("The only Element in emptyList: {0}", emptyList.Single()); |
خروجی مثال:
1 2 3 4 | The only element in oneElementList: 7 The only element in oneElementList: 7 Element in emptyList: 0 The only element which is less than 10 in intList: 7 |
در مثال زیر چون نتیجه یا بیش از یک عنصر است یا هیچ نتیجه ای ندارد Exception ایجاد می شود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | IList<int> oneElementList = new List<int>() { 7 }; IList<int> intList = new List<int>() { 7, 10, 21, 30, 45, 50, 87 }; IList<string> strList = new List<string>() { null, "Two", "Three", "Four", "Five" }; IList<string> emptyList = new List<string>(); //following throws error because list contains more than one element which is less than 100 Console.WriteLine("Element less than 100 in intList: {0}", intList.Single(i => i < 100)); //following throws error because list contains more than one element which is less than 100 Console.WriteLine("Element less than 100 in intList: {0}", intList.SingleOrDefault(i => i < 100)); //following throws error because list contains more than one elements Console.WriteLine("The only Element in intList: {0}", intList.Single()); //following throws error because list contains more than one elements Console.WriteLine("The only Element in intList: {0}", intList.SingleOrDefault()); //following throws error because list does not contains any element Console.WriteLine("The only Element in emptyList: {0}", emptyList.Single()); |
هیچ نظری ثبت نشده است