تفاوت بین Select و SelectMany در LINQ

عملگر Select و SelectMany هر دو جزء عملگرهای Projection هستند. عملگر Select برای انتخاب مقادیر از یک شی Collection استفاده می‌شود و از SelectMany زمانی که قصد داریم از Collection های تودرتو ( Collectionی از Collectionها) مقادیری را استخراج کنیم استفاده می‌شود.

عملگر Select یک مجموعه قابل شمارش را به ازای هر منبع داده‌ای تولید می‌کند در صورتی که SelectMany یک خروجی تکی حاصل از الحاق منابع داده‌ای را برمی‌گرداند. در حقیقت SelectMany خروجی Listی از Listها را به‌یک List ساده تبدیل می‌کند.

به مثال ساده‌ی زیر توجه کنید:

class Employee
    {
        public string Name { get; set; }
        public List<string> Skills { get; set; }
    }

static void Main(string[] args)
        {
            List<Employee> employees = new List<Employee>();
            Employee emp1 = new Employee { Name = "Mohsen", Skills = new List<string> { "C", "C++", "Java" } };
            Employee emp2 = new Employee { Name = "Reza", Skills = new List<string> { "SQL Server", "C#", "ASP.NET" } };

            Employee emp3 = new Employee { Name = "Ali", Skills = new List<string> { "C#", "ASP.NET MVC", "Windows Azure", "SQL Server" } };

            employees.Add(emp1);
            employees.Add(emp2);
            employees.Add(emp3);

            // از طریق عملگر
            //Select()
            IEnumerable<List<String>> resultSelect = employees.Select(e => e.Skills);

            Console.WriteLine("**************** Select ******************");

            //به دو حلقه نیاز داریم چون کوئری لیستی از لیست‌ها را بر‌می‌گرداند
            foreach (List<String> skillList in resultSelect)
            {
                foreach (string skill in skillList)
                {
                    Console.WriteLine(skill);
                }
                Console.WriteLine();
            }

            // از طریق عملگر
            // SelectMany()
            IEnumerable<string> resultSelectMany = employees.SelectMany(emp => emp.Skills);

            Console.WriteLine("**************** SelectMany ******************");

            //  فقط یک حلقه نیاز است چون کوئری یک لیست قابل شمارش را برگردانده است
            foreach (string skill in resultSelectMany)
            {
                Console.WriteLine(skill);
            }

            Console.ReadKey();

        }

در نهایت خروجی به شکل زیر خواهد بود ( به فواصل جداکننده هر لیست در خروجی دقت کنید):

/*
**************** Select ******************
 

C
C++
Java
 
SQL Server
C#
ASP.NET
 
C#
ASP.NET MVC
Windows Azure
SQL Server
 
**************** SelectMany ******************
 
C
C++
Java
SQL Server
C#
ASP.NET
C#
ASP.NET MVC
Windows Azure
SQL Server


*/

 

 

 

  • Book.mark.hu
  • co.mments
  • De.lirio.us
  • del.icio.us
  • Digg
  • DotNetKicks
  • E-Mail
  • Facebook
  • feedmelinks
  • Google
  • LinkedIn
  • msdn Social
  • MyShare
  • Slashdot
  • StumbleUpon
  • TwitThis
  • Tumblr
  • Yahoo! Buzz
  • Yahoo! MyWeb
  • Print
امکان ارسال نظر برای این موضوع وجود ندارد