عملگرهای مجموعه ای در Linq بخش دوم

عملگرهای مجموعه ای در Linq بخش دوم

در ادامه مبحث Union در LINQ مثال دوم را بررسی می کنیم .

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

تعریف Customer :

کلاسی بسازید و نام آنرا customer قرار دهید و property های زیر را در آن تعریف کنید :

public class Customer

    {

        #region Properties…

        public string CustomerID { get; set; }

        public string CompanyName { get; set; }

        public string Address { get; set; }

        public string City { get; set; }

        public string Region { get; set; }

        public string PostalCode { get; set; }

        public string Country { get; set; }

        public string Phone { get; set; }

        public string Fax { get; set; }

        public List<Order> Orders { get; set; }

        #endregion

    }

اکنون کلاسی بنام CustomerRepository تعریف کنید و کدهای زیر را در آن بنویسید :

        private List<Customer> _customers;

        public CustomerRepository()

        {

            LoadCustomers();

        }

        private void LoadCustomers()

        {

            _customers = (

 from customerElement in XDocument.Load(@"Datasouce\Customers.xml").Root.Elements("customer")

                            select new Customer

                            {

                                CustomerID = (string)customerElement.Element("id"),

                                CompanyName = (string)customerElement.Element("name"),

                                Address = (string)customerElement.Element("address"),

                                City = (string)customerElement.Element("city"),

                                Region = (string)customerElement.Element("region"),

                                PostalCode = (string)customerElement.Element("postalcode"),

                                Country = (string)customerElement.Element("country"),

                                Phone = (string)customerElement.Element("phone"),

                                Fax = (string)customerElement.Element("fax"),

                                Orders = (

                                    from orderElement in customerElement.Elements("orders").Elements("order")

                                    select new Order

                                    {

                                        OrderID = (int)orderElement.Element("id"),

                                        OrderDate = (DateTime)orderElement.Element("orderdate"),

                                        Total = (decimal)orderElement.Element("total")

                                    }).ToList()

                            }).ToList();

        }

        public IEnumerable<Customer> GetAll()

        {

            return _customers;

        }

توضیح متد LoadCustomer :

همانطور که در ابتدای این متد مشاهده می کنید ، لیست مشتریان را از یک فایل xml که در پوشه Datasource می باشد خواندیم . ساختار این فایل بصورت زیر است :

<customers>

  <customer>

    <id>ALFKI</id>

    <name>Alfreds Futterkiste</name>

    <address>Obere Str. 57</address>

    <city>Berlin</city>

    <postalcode>12209</postalcode>

    <country>Germany</country>

    <phone>030-0074321</phone>

    <fax>030-0076545</fax>

    <orders>

      <order>

        <id>10643</id>

        <orderdate>1997-08-25T00:00:00</orderdate>

        <total>814.50</total>

      </order>

      <order>

        <id>10692</id>

        <orderdate>1997-10-03T00:00:00</orderdate>

        <total>878.00</total>

      </order>

      <order>

        <id>10702</id>

        <orderdate>1997-10-13T00:00:00</orderdate>

        <total>330.00</total>

      </order>

      <order>

        <id>10835</id>

        <orderdate>1998-01-15T00:00:00</orderdate>

        <total>845.80</total>

      </order>

      <order>

        <id>10952</id>

        <orderdate>1998-03-16T00:00:00</orderdate>

        <total>471.20</total>

      </order>

      <order>

        <id>11011</id>

        <orderdate>1998-04-09T00:00:00</orderdate>

        <total>933.50</total>

      </order>

    </orders>

  </customer>

</customers>

مشاهده می کنید که ریشه اصلی این ساختار customers است و دارای زیرشاخه هایی بنام customer می باشد . هر customer دارای مشخصاتی مانند شماره تلفن ، ایمیل و غیره می باشد و در نهایت زیرشاخه ای بنام orders دارد که تعیین کننده سفارشات هر مشتری است . هر orders شامل چندین order است که بیانگر جزئیات هر سفارش است (مانند آیدی – تاریخ – قیمت کل)

در متد LoadCustomer ، میخواهیم اطلاعات مشتریان را از این ساختار سلسله مرتبی بیرون بکشیم و به لیست تبدیل کنیم (ToList) .

ادامه عملگر Union :

بعد از تعریف کلاس های Customer , CustomerRepository اکنون تابع Union2 را بصورت زیر تعریف کنید :

public static void Union2()

        {

            var products = new ProductRepository().GetAll();

            var customers = new CustomerRepository().GetAll();

            var productFirstChars =

                                    from product in products

                                    select product.ProductName[0];

            var customerFirstChars =

                                    from customer in customers

                                    select customer.CompanyName[0];

            var uniqueFirstChars = productFirstChars.Union(customerFirstChars);

            Console.WriteLine("Unique first letters from Product names and Customer names:\n———————————");

            foreach (var character in uniqueFirstChars)

            {

                Console.WriteLine(character);

            }

        }

توضیح : ابتدا لیست کامل محصولات و نیز مشتریان را بدست آورده ایم و سپس اولین کاراکتر نام محصول را در متغیر productFirstChars و اولین حرف company را داخل customerFirsthars ریختیم .

 در نهایت لیستی از کاراکترهای غیرتکراری را برمیگرداند که یا در لیست اول است یا دوم و یا هردو .

نکته ۱) : نوع هر دو لیست برای union کردن باید یکی باشد مثلا هر دو int باشند .

نکته ۲) : عملگر union تکراری ها را حذف می کند .

مبحث اجتماع یا Union با پایان رسید . در مقاله بعد در زمینه اشتراک یا Intersect صحبت خواهیم کرد .


تاریخ انتشار : ۲ فروردین ۱۳۹۵



دیدگاه ها :