<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های آرزو باقری</title>
        <link>https://virgool.io/feed/@ArezooBagheri</link>
        <description>علاقه مند به مهندسی نرم افزار</description>
        <language>fa</language>
        <pubDate>2026-06-28 19:12:51</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>آرزو باقری</title>
            <link>https://virgool.io/@ArezooBagheri</link>
        </image>

                    <item>
                <title>الگوی طراحی Builder</title>
                <link>https://virgool.io/@ArezooBagheri/%D8%A7%D9%84%DA%AF%D9%88%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-builder-m6x6rtczx0az</link>
                <description>الگوی طراحی Builder یکی از الگوهای طراحی Creational می باشد که به شما اجازه می‌دهد شیء‌های پیچیده را گام به گام ساخته و تشکیل دهید. این الگو به شما امکان می‌دهد از همان کد ساخت یک شیء ، انواع و نمایش‌های مختلفی از آن شیء را ایجاد کنید. مسئله : تصور کنید یک شیء پیچیده وجود دارد که نیاز به مقداردهی مرحله‌ به‌ مرحله و دقیق بسیاری از فیلدها و شیء‌ های تودرتو دارد. چنین کدی معمولاً درون یک سازنده هولناک با تعداد زیادی پارامتر قرار دارد. یا حتی بدتر در سراسر کد مشتری پراکنده شده است. به عنوان مثال : فرض کنید که می‌خواهید یک شیء خانه (House) ایجاد کنید. برای ساخت یک خانه ساده، شما نیاز به ساخت چهار دیوار و یک زمین، نصب یک در، نصب یک جفت پنجره و ساخت یک سقف دارید. اما اگر می‌خواهید یک خانه بزرگتر، روشن‌تر با یک حیاط پشتی و سایر امکانات (مانند یک سیستم گرمایشی، لوله‌کشی و سیم‌کشی برق) داشته باشید؟ ساده‌ترین راه‌حل این است که کلاس پایه House را گسترش دهید و یک مجموعه زیرکلاس ایجاد کنید تا همه‌ی ترکیب‌های پارامترها را پوشش دهند. اما در نهایت، شما با تعداد قابل توجهی از زیرکلاس‌ها مواجه خواهید شد. هر پارامتر جدید، مانند سبک تراس، نیاز به افزایش این سلسله مراتب را بیشتر می‌کند. یک رویکرد دیگر وجود دارد که نیازی به ایجاد زیرکلاس‌ها ندارد. شما می‌توانید یک سازنده عظیم را در کلاس پایه House ایجاد کنید که تمام پارامترهای ممکنی را که کنترل شیء خانه را دارند، شامل شود. اگرچه این رویکرد واقعاً نیاز به زیرکلاس‌ها را از بین می‌برد، اما مشکل جدیدی ایجاد می‌کند.در اکثر موارد، بیشتر پارامترها استفاده نخواهند شد که باعث می‌شود فراخوانی‌های سازنده بسیار زشت باشند. به عنوان مثال ، تنها یک بخش کوچک از خانه‌ها استخر دارند، بنابراین پارامترهای مربوط به استخر در نهایت ده مورد از ده مورد بی‌استفاده خواهند بود.راه حل : الگوی Builder پیشنهاد می‌دهد که کد ساخت شیء را از کلاس خود آن استخراج کرده و به اشیاء جداگانه به نام سازندگان (Builders) انتقال دهید. الگو اقدامات ساخت شیء را به یک مجموعه مراحل (مانند ساخت دیوارها، ساخت در و غیره) سازماندهی می‌کند. برای ایجاد یک شیء ، شما یک سری از این مراحل را بر روی یک شیء سازنده اجرا می‌کنید. بخش مهم این است که نیازی به فراخوانی همه‌ی مراحل نیست. می‌توانید فقط آن مراحلی را که برای تولید یک پیکربندی خاص از یک شیء لازم است، فراخوانی کنید. بعضی از مراحل ساخت ممکن است در صورت نیاز به ایجاد نمایش‌های مختلف محصول، پیاده‌سازی متفاوتی داشته باشند. به عنوان مثال ، دیوارهای یک کلبه ممکن است از چوب ساخته شوند، اما دیوارهای قلعه باید از سنگ ساخته شوند. در این صورت، می‌توانید چندین کلاس سازنده مختلف ایجاد کنید که همان مجموعه مراحل ساخت را به یک نحو متفاوت پیاده‌سازی کنند. سپس می‌توانید این سازندگان را در فرآیند ساخت (یعنی یک مجموعه مرتب از فراخوانی‌های مراحل ساخت) برای تولید انواع مختلفی از اشیاء استفاده کنید. به عنوان مثال ، تصور کنید یک سازنده وجود دارد که همه چیز را از چوب و شیشه می‌سازد، یک دیگر که همه چیز را از سنگ و آهن می‌سازد و یک سوم که از طلا و الماس استفاده می‌کند. با فراخوانی همان مجموعه مراحل، شما یک خانه معمولی از سازنده اول، یک قلعه کوچک از دوم و یک کاخ از سوم دریافت می‌کنید. با این حال، این فقط در صورتی کار خواهد کرد که کد مشتری که مراحل ساخت را فراخوانی می‌کند، قادر به ارتباط با سازندگان با استفاده از یک رابط مشترک باشد. می‌توانید بیشتر بروید و یک سری از فراخوانی‌ها به مراحل سازنده که برای ساخت یک محصول استفاده می‌کنید، را به یک کلاس جداگانه به نام مدیر استخراج کنید. کلاس مدیر ترتیبی را که مراحل ساخت را اجرا کنید تعریف می‌کند، در حالی که سازنده پیاده‌سازی برای این مراحل را فراهم می‌کند. داشتن یک کلاس مدیر (Director) در برنامه شما ضروری نیست. همیشه می‌توانید مراحل ساخت را به ترتیب مشخص مستقیماً از کد مشتری فراخوانی کنید. با این حال، کلاس مدیر ممکن است یک مکان مناسب برای قرار دادن روال‌های مختلف ساخت باشد تا بتوانید از آنها در سراسر برنامه خود استفاده مجدد کنید. علاوه بر این، کلاس مدیر جزئیات ساخت محصول را کاملاً از کد مشتری پنهان می‌کند. مشتری تنها نیاز دارد یک سازنده را با یک مدیر مرتبط کند، ساخت را با مدیر شروع کند، و نتیجه را از سازنده دریافت کند.کلاس دیاگرام : گام اول ، Builder : مراحل ساخت محصول را که برای همه انواع سازندگان مشترک است ، اعلام میکند.گام دوم ،  Concrete Builder : پیاده سازی های مختلف و همچنین پیاده سازی Builder توسط  Concrete Builder انجام می شود ، این Concrete Builder ها ممکن است محصولاتی را تولید کنند که با رابط مشترک سازگار نیستند.گام سوم ، Director : ترتیبی را که باید مراحل ساخت را فراخوانی کرد ، تعریف میکند تا بتوانید پیکربندی های خاصی از محصولات را ایجاد و بازیافت کنید.گام چهارم ، Product : شیء هایی نهایی هستند که توسط سازندگان مختلف (Builder) ایجاد شده اند و متعلق به هیچ سلسله مراتب یا واسط نیستند. گام پنجم ، Client : مشتری باید یکی از اشیاء سازنده (Builder) را با مدیر (Director) مرتبط کند. معمولا این کار تنها یک بار ، از طریق پارامترهای سازنده مدیر (Director) انجام می شود. سپس Director از آن شیء Builder برای همه ساخت های بعدی استفاده می کند. البته رویکرد جایگزینی هم وجود دارد که در آن Client شیء Builder را به متد Production در Director پاس می دهد. در این صورت شما می توانید هر بار که با Director یک Product ایجاد می کنید ، از یک Builder متفاوت استفاده کنید.مثالی ساده از پیاده سازی الگوی Builder به زبان #C ، در زمینه ساخت یک سیستم سفارش آنلاین برای یک فروشگاه آنلاین :کلاس Order ، این کلاس نمایانگر سفارشات است و ویژگی هایی مانند : محصولات ، تعداد ، آدرس تحویل و وضعیت پرداخت را دارد :       public class Order
   {
       public List&lt;string&gt; Products { get; set; } = new List&lt;string&gt;();
      public List&lt;int&gt; Quantities { get; set; } = new List&lt;int&gt; { 0 };
       public string DeliveryAddress { get; set; }
       public bool IsPaid { get; set; }

       public void Display()
       {
           Console.WriteLine(&amp;quotOrder Details:&amp;quot);

           for (int i = 0; i &lt; Products.Count; i++)
           {
               Console.WriteLine($&amp;quotProduct: {Products[i]}, Quantity: {Quantities[i]}&amp;quot);
           }

          Console.WriteLine(&amp;quotDelivery Address: &amp;quot + DeliveryAddress);
           Console.WriteLine(&amp;quotPayment Status: &amp;quot + (IsPaid ? &amp;quotPaid&amp;quot : &amp;quotNot Paid&amp;quot));
     }
     }واسط IOrderBuilder تعیین می کند که چه مراحلی برای ساخت یک سفارش لازم است : public interface IOrderBuilder
 {
     void AddProduct(string product, int quantity);
     void SetDeliveryAddress(string address);
     void SetPaymentStatus(bool isPaid);
     Order GetOrder();
 }کلاس OnlineOrderBuilder مسئول ساخت سفارشات آنلاین است و مراحل مختلف ساخت را انجام میدهد : public class OnlineOrderBuilder : IOrderBuilder
 {
     private  Order _order = new Order ();

     public void AddProduct(string product, int quantity)
     {
         _order.Products.Add(product);
         _order.Quantities.Add(quantity);
     }
     public Order GetOrder()
     {
         return _order;
     }
     public void SetDeliveryAddress(string address)
     {
         _order.DeliveryAddress = address;
     }
     public void SetPaymentStatus(bool isPaid)
     {
         _order.IsPaid = isPaid;
     }
 }کلاس OrderProcessor به عنوان Director عمل می کند و مراحل ساخت سفارشات را کنترل می کند :    public class OrderProcessor
    {
        private IOrderBuilder _builder;
        public OrderProcessor(IOrderBuilder builder)
        {
            _builder = builder;
        }
        public void ConstructOrder()
        {
            _builder.AddProduct(&amp;quotLaptop&amp;quot, 1);
            _builder.AddProduct(&amp;quotPhone&amp;quot, 2);
            _builder.SetDeliveryAddress(&amp;quot123 Main St&amp;quot);
            _builder.SetPaymentStatus(true);
        }
        public Order GetOrder()
        {
            return _builder.GetOrder();
        }
    }حالا می‌توانیم از کلاس OrderProcessor به عنوان Director و کلاس OnlineOrderBuilder به عنوان ConcreteBuilder برای ساخت سفارشات آنلاین استفاده کنیم. public class Program
 {
     static void Main(string[] args)
     {
         OnlineOrderBuilder builder = new OnlineOrderBuilder();
         OrderProcessor processor = new OrderProcessor(builder);
         processor.ConstructOrder();
         Order onlineOrder = processor.GetOrder();
         onlineOrder.Display();  
     }
 }در این مثال ، با استفاده از OrderProcessor و OnlineOrderBuilder یک سفارش آنلاین ساخته شده است. سپس با استفاده از متد ;()Display ، جزئیات سفارش نمایش داده شده است.الگوی طراحی Builder مزایا و معایبی دارد که بهتر است در نظر گرفته شوند : مزایا :جداسازی فرآیند ساخت : Builder جداسازی فرآیند ساخت یک شیء پیچیده از نمایش آن را فراهم می‌کند. این به معنای این است که ما می‌توانیم از یک فرآیند ساخت مشترک برای ایجاد نمایش‌های مختلفی از یک شیء استفاده کنیم.پیکربندی قابل توسعه : این الگو اجازه می‌دهد که شیء‌های پیچیده با ترکیب مراحل مختلف ساخته شوند. همچنین ، اضافه کردن مراحل ساخت جدید به Builder به سادگی انجام می‌شود.کد خوانا و قابل نگهداری : با استفاده از Builder ، کد مربوط به ساخت شیء به شیوه‌ای سازمان‌یافته و خوانا تبدیل می‌شود. این باعث می‌شود که کد قابلیت نگهداری و توسعه راحت‌تری داشته باشد.معایب : پیچیدگی اضافی : الگوی Builder ممکن است برای ساخت اشیاء ساده و بدون پیچیدگی ، مانند اشیاء با تعداد کمی از ویژگی‌ها ، پیچیده باشد. این الگو بیشتر در مواقعی که شیء دارای ویژگی‌های بسیار زیاد یا پیچیده است، موثر است.افزایش تعداد کلاس‌ها : استفاده از Builder می‌تواند به افزایش تعداد کلاس‌ها و تعقیب آنها منجر شود. برای هر شیء، باید یک Builder متناظر وجود داشته باشد که می‌تواند پیچیدگی را افزایش دهد.کد تکراری : در برخی موارد، ممکن است الگوی Builder باعث تولید کد تکراری شود ، به ویژه اگر مراحل ساخت برای شیء‌های مختلف به طور کامل یا جزئی تکرار شود.در کل ، الگوی طراحی Builder مناسب برای ساخت شیء‌های پیچیده با ترکیب مراحل مختلف ساخت است، اما باید توجه داشت که استفاده از آن باید با توجه به نیازها و شرایط ویژه هر پروژه انجام شود.منبع :https://refactoring.guru/design-patterns</description>
                <category>آرزو باقری</category>
                <author>آرزو باقری</author>
                <pubDate>Tue, 16 Apr 2024 08:13:47 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی Value Object Using Complex Type</title>
                <link>https://virgool.io/@ArezooBagheri/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-value-object-using-complex-type-wirriexrgjn6</link>
                <description>در EF 8 ویژگی هایی اضافه شده است که می خواهیم به Value object using complex type بپردازیم. انواع مختلفی از داده ها ممکن توی Data base نگهداری بشن :1) داده های ساده2) داده های چند مقداری با کلید3) داده های چند مقداری بدون کلید1) داده های ساده : مثلا یه Entity داریم ، یه سری اطلاعات ساده داخلش هست : نام ، نام خانوادگی ، تاریخ تولد و یه سری Primitive type وجود داره که به ازاش توی DB هم نوعی وجود داره و اینا میتونن به هم مپ بشن و هر کدوم از این داده ها به عنوان یک Column در جدول ما در نظر گرفته میشن.2) داده های چند مقداری با کلید : مثلا Order رو در نظر بگیرید با OrderLine ، خب OrderLine نگهداری میکنه که چه محصولی ، چه تعدادی و با چه قیمتی خریداری شده؟ ولی غیر از اینکه این داده ها رو نگه میداره یه شناسه هم میتونه داشته باشه ، یعنی OrderLine میتونه شناسه داشته باشه برای خودش و به عنوان یک جدول تو DB تعریف بشه و پراپرتی هایی هم که داره به عنوان فیلد های اون جدول در نظر گرفته میشن.3) داده های چند مقداری بدون کلید : یه سری دیگه داده داریم که مثل همین OrderLine چند مقداری هستن ولی شناسه پذیر نیستن، شناسه خاصی ندارن ، خودشون ویژگی هستن از یک Entity و اگر مقدارشون تغییر کنه، ماهیت شون عوض میشه. مثل رنگ RGB داره، وقتی در مورد رنگ صحبت می کنیم ، اگر هر کدوم از مقادیر RGB تغییر کنه ، دیگه رنگ، رنگ قبلی نیست، تغییر میکنه یا مثلا وقتی در مورد فردی صحبت می کنیم یه نفر ممکن اسمش عوض بشه ولی همون آدم قبلیه، یه نفر دائما سنش داره تغییر میکنه ولی همون آدم قبلیه ولی رنگی که RGBش تغییر بکنه رنگ قبلی نیست.به این داده ها میگیم Value Object ، داده هایی که با مقدارشون شناسایی میشن ، شناسه خاصی ندارن ، تغییر در آنها باعث تغییر در کل فرآیندشون میشه. همچین داده هایی رو در نسخه های قبلی EF به شکل های مختلفی نگهداری می کردیم. بعضی وقت ها به صورت Owned Type ازشون استفاده می کردیم ، یه وقت هایی خودشونو تبدیل میکردیم به یه Entity ، یعنی با اینکه Value Object بودن و با Value شون شناسایی میشدن ، یه شناسه ای از طرف خودمون بهش میدادیم صرفا بابت اینکه بتونیم جدولی بهشون تخصیص بدیم و شناسه شونو جاهای مختلف استفاده کنیم. یعنی Value Object رو تبدیل می کردیم به یه Entity . اینا راه کارهایی بود که ما تا قبل از این داشتیم اما در انتیتی فریم ورک هشت ، Complex Type ها اضافه شدن و می تونیم از Complex Type ها هم استفاده کنیم. به چه شکلی؟ مثال : مثلا یه کلاس Person داریم با یه کلاس PhoneNumber :    public class Person
    {
        public int Id { get; set; }
        public string   FirstName { get; set; }
        public string LastName { get; set; }
        public PhoneNumber Home { get; set; }
        public PhoneNumber Work { get; set; }
    }

    public class PhoneNumber
    {
        public string  CountryCode { get; set; }
        public string Phone { get; set; }
  } که از کلاس PhoneNumber در کلاس Person استفاده کردیم. حالا اگه اینو Add Migration کنیم خطا میده که نمیتونیم Db Context رو ازش Instance بسازیم چون یه انتیتی PhoneNumber داریم که Primary Key نداره ، همونطور که میدونیم دفعه اول که میخواد Instance ساخته بشه Model رو Db Context می سازه ، میره تمام رفرنس Type هایی که وجود داره ، به عنوان انتیتی در نظر میگیره و دونه دونه مپ شون میکنه. یکی از ویژگی هایی هم که انتیتی باید داشته باشه که پذیرفته بشه از طرف Db Context ، داشتن شناسه است. کلاس PhoneNumber شناسه نداره و داره به ما خطا میده. حالا تکلیف چیه؟تکلیف اینه که ما براش شناسه بزاریم، اما چجوری این کار و کنیم؟ میاییم Id میزاریم؟ نه، نمیخواییم شناسه داشته باشه، PhoneNumber من اگه شماره عوض بشه Entity کلا عوض میشه، کل ارزش اون Data از بین رفته ، دیگه Data قبلی نیست ، نمیخوام بهش Id بدم که مقدارش بخواد عوض بشه ، میخوام تبدیلش کنم به Value Object ، میام از Complex Type استفاده میکنم :     [ComplexType]
    public class PhoneNumber
    {
        public string  CountryCode { get; set; }
        public string Phone { get; set; }
    }حالا PhoneNumber رو به عنوان Value Object شناسایی میکنه. اگه این بار Migration بزنیم ، DB رو ایجاد کرده و به ازای هر کدوم فیلدهاشونو ایجاد کرده و مثل فیلدهای عادی میتونیم ازش استفاده کنیم. اما نکته ای که هست ما از کلاس PhoneNumber داریم استفاده می کنیم برای نگهداری Value Object ها،  یعنی کلاسم قابل تغییره و وقتی کلاسم که یه Value Object هست ، جاهای مختلف استفاده بشه و تغییر بکنه ، کل رفرنس های اون کلاس تغییر میکنه ، باید کلاس مونو Immutable کنیم ، یعنی مثل Value Object که توی DDD تعریف می کنیم یا میاییم Private می کنیم و متد بنویسیم برای تغییرش ، یا اینکه اصلا اینجا میگیم :    [ComplexType]
    public record PhoneNumber(string countryCode , string phone);اینا راه کارهایی هستن که برامون وجود داره و از این به بعد دیگه Immutable بودن رو خود دات نت برامون رعایت میکنه.</description>
                <category>آرزو باقری</category>
                <author>آرزو باقری</author>
                <pubDate>Thu, 21 Mar 2024 17:17:47 +0330</pubDate>
            </item>
                    <item>
                <title>ویژگی Collection Expressions در سی شارپ 12</title>
                <link>https://virgool.io/@ArezooBagheri/%D9%88%DB%8C%DA%98%DA%AF%DB%8C-collection-expressions-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-12-gybc4rpqkves</link>
                <description>در نسخه 12 زبان سی شارپ ، ویژگی های جدیدی اضافه شده است ، یکی از این ویژگی ها Collection Expressions می باشد. این ویژگی به ما امکان می دهد مقداردهی اولیه به مجموعه ها را با یک نحو کوتاه انجام دهیم.نمونه هایی از این قابلیت ها عبارتند از :1) آرایه ها : تعریف آرایه با مقادیر اولیه 2) استفاده از Spread Operator برای ترکیب آرایه ها 3) لیست ها : تعریف لیست با مقادیر اولیهقبل از اینکه به مثال ها بپردازیم ، ببینیم مشکل سی شارپ 11 چی بوده و Collection Expression اومده چی رو برامون حل کنه؟ قبلنا وقتی می خواستیم با Collection ها کار کنیم و این Collection ها فرقی نداره ، آرایه باشه ، Span , ReadOnlySpan , List یا ImmutableObject ، باشن ، هر چیزی که ماهیت یک مجموعه ، ماهیت یک Collection  رو داره ، رفتارهای متفاوت یا Syntax متفاوتی داشته. به طور مثال : وقتی آرایه [ ] int می خواستیم بسازیم باید با { } initialize می کردیم ، همون رو می تونیم با [ ]new int هم initialize کنیم ، همون رو دوباره می تونستیم با new آرایه initialize کنیم. یعنی برای یه initialize کردن int سه روش متفاوت داریم : public void Test() 
 { 
      int[] ints = { 1, 2, 3 };
      int[] ints2 = new int[] { 1, 2, 3 };    
      int[] ints3 = new[] { 1, 2, 3 }; 
}حالا عین همون رو برای Collection های متفاوت ، مثلا برای span یه مدل :            Span&lt;int&gt; span = new Span&lt;int&gt;(new[] { 1, 2, 3 });همون رو برای لیست استفاده کنیم ، میبینیم یه شکل دیگه است :            List&lt;int&gt; list = new() { 1, 2, 3 };یا مثلا برای ImmutableObject ها :            ImmutableArray&lt;int&gt; immutableArray = ImmutableArray.Create(new[] { 1, 2, 3 });باید با ImmutableArray.Create یه object بسازیم. پس این تفاوت در  Syntax ، تفاوت در نگاهی که به Collection ها داریم ، باعث گیج شدنمون میشه. اول ببینیم اصلا این Expression چیه؟ به این میگن یه Statement :             int[] ints = { 1, 2, 3 };یعنی یک خط دستوری ، هر چیزی که اونور تساوی باشه ،  ;{ 1,2,3 } ، بهش میگن Expression ، هر چیزی که بیاد اینور تساوی  int[ ] ints ، بهش میگن Expression یا این شکلی &lt;= int[ ] ints ، حالا Expression که داره روی Collection ها کار میکنه ، پس باید دنبال یه Syntax باشیم که اولا اینور تساوی باشه ، یعنی :  ;{ 1,2,3 }  دوما روی Collection ها باشه. خب حالا اگه همین Syntax رو تبدیل به دات نت 8 و سی شارپ 12 کنیم ، ببینیم چیکار می تونیم بکنیم ؟ اینکه این رو  ;int[ ] ints = { 1, 2, 3 } ، وقتی آرایه است چرا initialize با { } باشه ؟ به عنوان یه Collection می بینیم که خودش هم یه کالکشن  [ ] int ، پس عین همون رو استفاده کنیم و init کنیم :            int[]  ints = [ 1, 2, 3 ];در خط زیر هم ، هم چنین ، { }  [ ]new int رو بر می داریم ، عین قبلی  [ ] بکنیم :            int[] ints2 = [ 1, 2, 3 ]; و Syntax بعدی رو هم بر می داریم :             int[] ints3 = [ 1, 2, 3 ];پس روی آرایه ها می بینیم که به یه شکل داریم کار می کنیم. روی Span ها قبلا Target Expression داشتیم، یعنی : Target Typed Expression ،،، Target Typed Expression میگه دیگه نیازی نیست جلوی new حتما اون Type رو بگی ، چون اینور میدونی چی هستش :             Span&lt;int&gt; span = new Span&lt;int&gt;(new[] { 1, 2, 3 });پس می تونیم  new Span&lt;int&gt;(new[ ] { }) رو برداریم :            Span&lt;int&gt; span = [ 1, 2, 3 ];میبینیم که خود Span رو هم عین Array می تونیم init کنیم. این ReadOnlySpan هم همین طور :            ReadOnlySpan&lt;int&gt; span2 = stackalloc[] {1,2,3};این رو هم می تونیم باز دوباره این شکلی کنیم :            ReadOnlySpan&lt;int&gt; span2 = [1,2,3];پس تمام Syntax ها یه شکل میشن. روی List ها هم همین :            List&lt;int&gt; list = [ 1, 2, 3 ];مهم ترین قسمت روی ImmutableObject ها بود :            ImmutableArray&lt;int&gt; immutableArray = ImmutableArray.Create(new[] {1, 2, 3 });روی این هم ، این قابلیت رو داریم که Simplified کنیم :            ImmutableArray&lt;int&gt; immutableArray = [1, 2, 3 ];اما همچین چیزی نمی تونیم داشته باشیم :                var nums = [ 1, 2, 3 ];همچین چیزی رو کامپایلر به ما اجازه نمیده ، چون گفتیم Target Typed Expression ، یعنی وقتی اینور تساوی Expression هستش ، باید بفهمه که این Collection رو باید به چی مپ کنه؟ اینور هنوز نمیدونه var nums !!! اگه  ;int[ ] nums = [ 1, 2, 3 ] کنیم میفهمه.آیا به عنوان پارامتر هم می تونیم Collection Expression بفرستیم بدون اینکه دوباره New کنیم ؟Calculator calculator = new();
calculator.Sum([1,2,3]);اوکی ، روی پارامتر هم می تونیم.تا قبل از سی شارپ 12 ما می تونستیم این دو تا کاراکتر رو با همدیگه یک Array جدید بسازیم : string hydrogen =&quot;H&quot;; string helium =&quot;He&quot;;string[ ] elements = new string[ ] { hydrogen, helium };اما مشکلی که داشتیم توی سی شارپ 11 ، این بود که ما دو تا Array رو نمی تونستیم Concat کنیم ، نمی تونستیم به هم دیگه بچسبونیمش و یک Array جدید درست کنیم :    string[ ] vowels = new string[ ] { &quot;a&quot;, &quot;e&quot;, &quot;i&quot;, &quot;o&quot;, &quot;u&quot;};     string[ ] consonants = { &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;z&quot; };یعنی vowels رو +  consonants کنیم و یک Array جدید درست کنیم ، باید توی این vowels می چرخیدیم ، While می کردیم ، Foreach می کردیم و روی consonants هم Foreach می کردیم و روی Array سوم Append ش می کردیم. اما حالا می بینیم که می تونیم همه رو با همدیگه از قابلیت Collection Expression استفاده کنیم. اما اگه بخواییم Concat بکنیم چی؟! وقتی بخواییم Concat بکنیم یک دستور جدیدی اومده ، ابتدا همه رو به صورت Collection می کنیم که یه شکل بشن :   string[ ] vowels = [ &quot;a&quot;, &quot;e&quot;, &quot;i&quot;, &quot;o&quot;, &quot;u&quot; ];  string[ ] consonants = [ &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;z&quot; ];می خواییم یه Array جدید درست کنیم :            string[] alphabet = [.. vowels, .. consonants];اینجا یه دستور جدیدی اومده به نام Spread Element ، میگه شما با این دو تا .. (دات) میتونی بگی کل Element های Array اول + کل Element های Array دوم ، در قالب یه Collection جدید Append ش کن.آیا این Spread Element رو می تونیم روی Condition ها هم داشته باشیم ؟ مثل این :            int x = 2;
            int y = 5;
            bool z = false;

            List&lt;int&gt; f = z ? [1, 2, 3] : [];
            List&lt;int&gt; final = [x, y, .. f];پس می تونیم توی initialize کردن یه Collection ، هم int داشته باشیم و هم List ، در کنارش Spread کنیم با قابلیت Spread Element همه این Collection Expression روی init کردن لیست های متفاوت ، روی ارسال به عنوان یک پارامتر ، در زمان return کردن ، در زمان init کردن روی ImmutableObject ها و ... قابلیت داره.یکی از بهترین ویژگی هایی هستش که سی شارپ 12 در اختیارمون قرار داده.</description>
                <category>آرزو باقری</category>
                <author>آرزو باقری</author>
                <pubDate>Sat, 02 Mar 2024 12:58:47 +0330</pubDate>
            </item>
                    <item>
                <title>تبریک روز مهندس</title>
                <link>https://virgool.io/@ArezooBagheri/%D8%AA%D8%A8%D8%B1%DB%8C%DA%A9-%D8%B1%D9%88%D8%B2-%D9%85%D9%87%D9%86%D8%AF%D8%B3-vjqjl8qxiaqr</link>
                <description>پنجم اسفند ماه زادروز خواجه نصیرالدین طوسی و روز مهندس گرامی باد.روز مهندس اهمیتی عمیق تر از به رسمیت شناختن یک حرفه دارد. مهندسان نقش مهمی در شکل دادن به دنیای ما ، حل مشکلات پیچیده و ایجاد راه حل های نوآورانه ایفا می کنند. مهندسان چه طراحی پل ها ، نوشتن کد یا توسعه فن آوری های جدید باشد ، سهم قابل توجهی در پیشرفت و توسعه دارند.معماران نوآوری ، سازندگان رویاها و حل کننده های مشکلات ، امروز شما را جشن می گیریم : مهندسان نرم افزار ، شما معمار جهان های دیجیتال ، اشکال زدای کد و خالق راه حل های زیبا هستید. چه در حال ساخت برنامه های کاربردی وب ، بهینه سازی الگوریتم ها یا ایجاد رابط های کاربری زیبا باشید ، کار شما بر زندگی میلیون ها نفر تأثیر می گذارد. به کدنویسی ادامه دهید ، به نوآوری ادامه دهید و دنیای دیجیتال را به مکانی بهتر تبدیل کنید!  باشد که الگوریتم‌های شما کارآمد باشند ، تست‌های شما بگذرد و استقرار شما یکپارچه باشد.مهندسان هوافضا ، رویاپردازانی که چشمانشان به ستاره هاست ، شما بال هایی طراحی می کنید که گرانش را به چالش می کشند معادلات شما موشک ها را فراتر از اتمسفر به حرکت در می آورد و اسرار را به کیهان زمزمه می کند. شما ناوبرهای کیهانی هستید که مسیرهای بی نهایت را ترسیم می کنید.مهندسان عمران ، نگهبانان زیر ساخت ها ، شما پل هایی که از شکاف ها و جاده هایی که به مقصدهای ناشناخته منتهی می شوند ، می سازید. بتن و فولاد شما گواه تاریخ است. شما معماران اتصال هستید.مهندسان مکانیک ، قلع و قمع سازان و مخترعان ، شما به ماشین ها جان می دهید. از ساعت های ظریف گرفته تا موتورهای خروشان ، دستان شما چرخ دهنده های پیشرفت را شکل می دهند. شما نگهبانان حرکت و دقت هستید.مهندسان خلاق ، شورشیان با هدف ، شما هنر را با عملکرد ترکیب می کنید. چه یک تلفن هوشمند شیک باشد یا یک ساختمان آینده نگر، طرح های شما باعث ایجاد هیبت و الهام می شود. شما نقاشان بوم عملی هستید.  مهندسانی که با کنجکاوی متحد شده اید ، با کنجکاوی تغذیه می شوید و به دنبال پیشرفت هستید ، امروز شما را گرامی می داریم. باشد که معادلات شما ظریف ، نمونه های اولیه شما انعطاف پذیر و تاثیر شما بی اندازه باقی بماند.روز مهندس را به تمام مهندسان عزیز تبریک می‌گویم. آرزوی بهترین ها در روز مهندس برای شما...</description>
                <category>آرزو باقری</category>
                <author>آرزو باقری</author>
                <pubDate>Fri, 23 Feb 2024 23:36:04 +0330</pubDate>
            </item>
                    <item>
                <title>ساختمان داده ها ( قسمت دوم )</title>
                <link>https://virgool.io/@ArezooBagheri/%D8%B3%D8%A7%D8%AE%D8%AA%D9%85%D8%A7%D9%86-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-sa7iui0df9bk</link>
                <description>در قسمت قبل کمی با آرایه آشنا شدیم که عناصرش چطور در حافظه ذخیره می شود و گفتیم که در آرایه میتونیم عملیاتی رو انجام دهیم ، مانند : جستجو ، درج ، حذف و ... در جستجو مدل خطی یا Linear Search و مدل دودویی یا Binary Search داریم. در جستجوی خطی گفتیم که عنصر مورد جستجو با هر یک از عناصر آرایه مقایسه می شود ، چنانچه با هم برابر بودند جستجو تمام می شود وگرنه عمل مقایسه با عنصر بعدی انجام می شود. این روند تا پایان عنصر مورد نظر و یا جستجوی تمام آرایه ادامه می یابد. می خواهیم ببینیم جستجوی دودویی چی هستش ؟ چطور می تونیم یه عنصری از آرایه را حذف کنیم ؟ با الگوریتم هاشون آشنا شده و یه مثال ساده با زبان #C پیاده سازی می کنیم.جستجوی دودویی یا Binary Search : فقط در آرایه های مرتب استفاده می شود. با فرض اینکه آرایه به صورت صعودی مرتب شده است : در این روش عنصر مورد نظر با خانه وسط آرایه مقایسه می شود ، اگر با این خانه برابر بود ، جستجو تمام می شود. اگر عنصر مورد جستجو از خانه وسط بزرگتر بود ، جستجو در بخش بالایی آرایه و در غیر این صورت جستجو در بخش پایینی آرایه انجام می شود.مثال : در لیست زیر ، می خواهیم ببینیم عدد 23 در کدام خانه قرار دارد ؟ابتدا خانه وسطی ( mid ) کلید 4 را با عدد 23 مقایسه می کنیم ، اگر کلید کمتر از عنصر mid است، به چپ و اگر بزرگتر از وسط است، فضای جستجو را به سمت راست می بریم. کلید (یعنی 23) بزرگتر از عنصر میانی فعلی (یعنی 16) است. پس فضای جستجو به سمت راست حرکت میکنه. کلید کمتر از Mid 56 فعلی است. فضای جستجو به سمت چپ حرکت می کند.اگر کلید با مقدار عنصر mid مطابقت داشته باشد ، عنصر پیدا شده و جستجو متوقف می شود.الگوریتم جستجوی دودویی Binary Search به زبان #C :    public int BinarySearch(int[] array, int x)
    {
        int i = 0, r = array.Length - 1;
        while (i &lt;= r)
        {
            int mid = i + (r - 1) / 2;
            if (array[mid] == x)
                return mid;
         if (array[mid] &lt; x)
                i = mid + 1;
            else
                r = mid - 1;
        }
        return -1;
   }نوع الگوریتم اینطور هستش با یک حلقه این کار انجام میشود ، تا وقتی i کمتر یا مساوی از r هست mid را پیدا میکند ، mid = (i  + r ) / 2 ، بعد از اینکه mid را پیدا کرد ، اگر عنصر وسط با عنصر مورد نظر برابر بود mid را برمیگرداند ، اگر عنصر مورد نظر از عنصر وسط بزرگتر بود ، در بخش بالایی آرایه دنبالش میگردد ، در بخش بالایی mid + 1 خواهد شد در غیر این صورت یعنی عنصر مورد نظر از عنصر وسط کوچکتر هستش ، در بخش پایینی آرایه دنبالش میگردد ، در بخش پایینی mid - 1  خواهد شد. اگر هم عنصر مورد نظر در آرایه وجود نداشته باشد 1- را برمیگرداند.مثال :در آرایه زیر با استفاده از الگوریتم Binary Search می خواهیم عدد 10 رو پیدا کنیم : public class Program
 {
     public int BinarySearch(int[] array, int x)
     {
         int i = 0, r = array.Length - 1;
         while (i &lt;= r)
         {
             int mid = i + (r - 1) / 2;
             if (array[mid] == x)
                 return mid;
             if (array[mid] &lt; x)
                 i = mid + 1;
             else
                 r = mid - 1;
         }
         return -1;
}
     public void Main()
     {
         int[] array = { 2, 3, 4, 10, 40 };
         int x = 10;

         int result = BinarySearch(array, x);

         if (result == -1)
             Console.WriteLine(
                 &amp;quotElement is not present in array&amp;quot);
         else
             Console.WriteLine(&amp;quotElement is present at &amp;quot
                         + &amp;quotindex &amp;quot + result);
     }
 }خروجی :Element is present at index 3حذف از آرایه (نامرتب) : در عملیات حذف، عنصری که باید حذف شود با استفاده از جستجوی خطی جستجو می شود (چون آرایه نامرتب) ، سپس عملیات حذف و سپس جابجایی عناصر انجام می شود.الگوریتم حذف از آرایه (نامرتب) به زبان #C :       int Delete(int[] arr, int n, int key)
 {
     int pos = FindElement(arr, n, key);
     if (pos == -1)
     {
         Console.WriteLine(&amp;quotElement not found&amp;quot);
         return n;
     }
     int i;
     for (i = pos; i &lt; n - 1; i++)
         arr[i] = arr[i + 1];
     return n - 1;
 }الگوریتم 3 ورودی دارد : آرایه ای به اسم a کل عناصر ، n تعداد عناصر موجود در آرایه ، key عنصری که می خواهیم حذفش کنیم. ابتدا با تابع ;()FindElement یک جستجوی خطی انجام می دهیم (چون آرایه نامرتب) ، اگر key وجود داشته باشد ، این تابع ، pos را به ما میدهد ، اگر هم عددی که دنبالش هستیم داخل آرایه نباشد ، یعنی pos == -1 باشد ، n را  بر میگرداند چون حذفی انجام نشده و تعداد خانه های آرایه همان هستش. اگر عددی که دنبالش هستیم داخل آرایه باشد عمل شیفت را انجام میدهد. یعنی از pos تا 1 - n مثال : در آرایه زیر می خواهیم عدد 30 را حذف کنیم :    public class Program
    {
        int FindElement(int[] arr, int n, int key)
        {
            for (int i = 0; i &lt; n; i++)
               if (arr[i] == key)
                    return i;
            return -1;
        }

        int DeleteElement(int[] arr, int n, int key)
        {
            int pos = FindElement(arr, n, key);
            if (pos == -1)
            {
                Console.WriteLine(&amp;quotElement not found&amp;quot);
                return n;
            }
            for (int i = pos; i &lt; n - 1; i++)
                arr[i] = arr[i + 1];
            return n - 1;
        }

          public void Main()
        {
            int i;
            int[] arr = { 10, 50, 30, 40, 20 };
           int n = arr.Length;
            int key = 30;
           Console.Write(&amp;quotArray before deletion  : &amp;quot);
            for (i = 0; i &lt; n; i++)
              Console.Write(arr[i] + &amp;quot &amp;quot);
              Console.WriteLine();

              // Function call
              n = DeleteElement(arr, n, key);
             Console.Write(&amp;quotArray after deletion  : &amp;quot);
              for (i = 0; i &lt; n; i++)
              Console.Write(arr[i] + &amp;quot &amp;quot);
        }
    }
}خروجی : Array before deletion  : 10 50 30 40 20
 Array after deletion  : 10 50 40 20</description>
                <category>آرزو باقری</category>
                <author>آرزو باقری</author>
                <pubDate>Sun, 18 Feb 2024 15:53:04 +0330</pubDate>
            </item>
                    <item>
                <title>ویژگی Primary Constructors در سی شارپ 12</title>
                <link>https://virgool.io/codenevis/%D9%88%DB%8C%DA%98%DA%AF%DB%8C-primary-constructors-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-12-dt9ufxzunv94</link>
                <description>در سی شارپ 12 ، ویژگی های مختلفی معرفی شده‌اند که یکی از آن ها Primary Constructors نام دارد. مزایای استفاده از Primary Constructors در سی شارپ عبارتند از :بهبود خوانایی کدها و درک سریع‌تر آن‌ ها : استفاده از Primary Constructor باعث کاهش تکرار کدها و افزایش خوانایی آن‌ها می‌شود.پذیرش مستقیم Dependency ها توسط پارامتر ها.عدم نیاز به استفاده از کلمه کلیدی this برای مقدار دهی به Property‌ های سازنده.تولید کدهای بهینه‌شده و بهبوداتی در کارایی :  استفاده از Primary Constructor باعث بهبود کارایی کدها می‌شود.می خواییم ببینیم Primary Constructor علاوه بر کدنویسی تمیزتر و کوتاه‌تر چه محدودیت هایی هم داره؟ با چن تا مثال به‌ همراه کدنویسی  ویژگی ها و محدودیت های Primary Constructor و همچنین به تفاوت primary constructor class و primary constructor record  می پردازیم :خب اگه بخواییم یه فیلدی رو اساین کنیم توی یه کلاس و در زمان ساخت این مقدار و بگیریم و فورس کنیم که حتما بهمون مقدار بده میاییم Constructor می سازیم یعنی :  public class Student
{
       private readonly int _id;
       public Student(int id)
 {
         _id = id;
}
}اینجا id رو میگیریم و اساین می کنیم. مثل تمام سرویس هایی که inject می کنیم. مثلا :   public class StudentService
   {
       private readonly IStudentProvider _studentProvider;
       public StudentService(IStudentProvider studentProvider)
       {
           _studentProvider = studentProvider;
       }
}خب IStudentProvider رو inject می کنیم. Primary Constructor میگه اگه (int id) رو بیاری جلو اسم کلاس یعنی : { } public class Student (int id) ، دیگه نیازی نیست اینارو بنویسی :  private readonly int _id;
   public Student (int id) 
   {
       _id = id;
  }من برات همه رو می نویسم و هر جایی که داری از این فیلد یعنی id_  استفاده میکنی من برات هندلش می کنم  پس نیازی به تعریف  ;private readonly int _id و تعریف Constructor نیست. تمام این ها به عنوانPrimary Constructor میاد این بالا : public class Student (int id)
 {
  }ولی این یه محدودیتی داره ، محدودیتش این که این مقدار :  private readonly int _id;
  public Student (int id) 
  {
        _id = id;
  }   هنگام کامپایل به یه همچین کدی تبدیل میشه :  public class Student_Compiled
   {
       private int _srutokjdmvnghtyoeks456lsk_id;
       public Student_Compiled (int id)
       {
           _srutokjdmvnghtyoeks456lsk_id = id;
       }
 }اولین تفاوتی که میبینیم readonly نداره ، وقتی از Primary Constructor استفاده می کنیم فیلدی که برای ما میسازه ، readonly نیستش. پس یکی از محدودیت های Primary Constructor  این که readonly  رو متوجه نمیشه. اگه بخواییم readonly رو داشته باشیم ،  بیاییم یک فیلد readonly تعریف کنیم. دیگه مستقیما با خود این id کار نکنیم. یعنی :  ;private readonly int _id = id ، که id رو اساین کنیم بهش و با id_ کار کنیم. فقط برای اینکه اون constructor رو ننویسیم. پس اولین محدودیت Primary Constructor این که readonly تبدیل نمیشه. دومین محدودیتش این که id رو داریم :   public class Student(int id)
   {
       public string ToString()
       {
           id = 123;
           return id.ToString();
       }
  }زمان کامپایل این id میاد داخل constructor :  public Student_Compiled(int id)
{
}یه فیلد درست میکنه که اسمش رو نمیدونیم چیه :   ;srutokjdmvnghtyoeks456lsk_id_ ؟؟؟ فقط خود کامپایلر می فهمتش و جاگزاری میکنه ، جاهایی که نیاز داریم یعنی این id دقیقا تبدیل شده به این :  ;srutokjdmvnghtyoeks456lsk_id_  ، محدودیتش این که id رو داریم ولی نمیتونیم بگیم this.id ، بخاطر این که کامپایلر نمیدونه اینو که داریم می نویسیم this.id ، تبدیل به چی کنه؟ پس چون نمیدونیم و هنگام کامپایل این اتفاق میفته پس نمیتونیم از کلمه this استفاده کنیم، فقط مستقیما میتونیم از id استفاده کنیم.مثلا : ;id = 123 ، چون وقتی کامپایل میشه این id  میاد داخل constructor و تبدیل به فیلد میشه و چون نمیدونیم کامپایلر قراره چه عددی اینجا  ;srutokjdmvnghtyoeks456lsk_id_  بزاره پس به واسطه همین از کلمه کلیدی this.id نمیتونیم استفاده کنیم.خب بریم مثال بعدی از Primary Constructor : تو کلاس Student میتونیم چن تا Constructor داشته باشیم  : یعنی یه Constructor Default ، public class Student
 {
     private readonly int _id;
     public Student()
     {
     }
      public Student(int id)
     {
         _id = id;
     }
} و یه Constructor که اینطوری id رو بگیریم. اما اگه (int id) رو بزاریم این جا : public class Student(int id)
{
}دیگه نیازی به تعریف فیلد نیست ، ولی هنگام استفاده از Primary Constructor اگه دیفالت Constructor می خواییم ، باید this رو بنویسیم یه default value هم بهش بدیم :  public Student() : this (15)
  {
  }حتما باید این کارو انجام بدیم تا Default Constructor برامون ساخته بشه. اینم یکی از امکاناتی که اگه از Primary Constructor و Default Constructor بخواییم هم زمان استفاده کنیم باید از this(15) استفاده کنیم تا بتونیم کامپایل کنیم. خب یه مثال دیگه از  Primary Constructor :  یه کلاس Entity داریم با یه Constructor :   public class Entity
    {
        public Entity(int id)
        {
        }
  }و یه کلاس Student :    public class Student : Entity
   {
       public Student(int id) : base(id)
       {
       }
  } با base اشاره داریم به کلاس Entity ، خب اگه این کلاس Entity مون Default Constructor بگیره : public class Entity(int id)
 {
 } پس : public Entity(int id)
    {
    } حذف میشه ، این جا از کلاس Student و base(id) داریم استفاده می کنیم ،  اگه کلاس Student رو Default Constructor کنیم :  public class Student(int id) : Entity
  {      
   }دیگه base , constructor نداریم ، میاییم مستقیما id رو بهش میدیم :  public class Student(int id) : Entity(id)
  {     
  }کلمه کلیدی base دیگه نیازی نیست.تفاوت Primary Constructor Class با Primary Constructor Record :   public record Student_Record(int Id);خب این Id مون ، Pascal ، یعنی تبدیل میشه به یه پراپرتی.     public class Student(int id)
{
    public string ToString()
    {
        return id.ToString();
    }
} و این id مون ، Camel Case ، یعنی تبدیل میشه به یه فیلد.اگه از Student_Record یه instance بگیریم :    public class Program
    {
        public static void Main(string[] args) 
        {
            Student_Record record = new(14);
           // record.Id 
        }
   }میتونیم Id رو ببینیم ، تبدیل میشه به یه پراپرتی. اما وقتی از Student یه instance بگیریم :    public class Program
    {
        public static void Main(string[] args) 
        {
            Student student = new(14);
           // student.id
        }
   }نمیتونیم id رو ببینیم ، تبدیل میشه به یه فیلد. پس فرق record با class متفاوت بودنشون از این جهت که :  public record Student_Record(int Id);این Id تبدیل به یه پراپرتی میشه. ولی :public class Student(int id) 
{
 }این id تبدیل به یه فیلد میشه و همچنین در کلاس کلمه کلیدی this رو نداریم. یعنی this.id نمی بینیم. چون نمیدونیم قراره کامپایلر تبدیل به چه عددی بکنه ، مثل این : private int _srutokjdmvnghtyoeks456lsk_id;بخاطر همین از this.id نمیتونیم استفاده کنیم ، فقط مستقیما از id استفاده می کنیم.خب این از قابلیت Primary Constructor ، محدودیت ها و بهینه تر بودنش.</description>
                <category>آرزو باقری</category>
                <author>آرزو باقری</author>
                <pubDate>Thu, 15 Feb 2024 18:02:05 +0330</pubDate>
            </item>
                    <item>
                <title>ساختمان داده‌ ها ( قسمت اول )</title>
                <link>https://virgool.io/@ArezooBagheri/%D8%B3%D8%A7%D8%AE%D8%AA%D9%85%D8%A7%D9%86-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7-mi4qwvkoz9hu</link>
                <description>ساختمان داده‌ها در برنامه‌نویسی اهمیت بسیاری دارند. این مفاهیم به ما کمک می‌کنند تا داده‌ها را بهینه‌تر ذخیره کنیم و عملیات‌های مختلف را با کارآیی انجام دهیم. اهمیت ساختمان داده‌ها :ذخیره‌سازی داده‌ها: ساختمان داده‌ها به ما امکان می‌دهند داده‌ها را در قالب‌های خاص ذخیره کنیم. این قالب‌ها در برخی عملیات کارآمد و در برخی دیگر ناکارآمد هستند. برای هر مساله، ساختمان داده‌ای انتخاب می‌شود که بهینه‌ترین حالت ممکن را فراهم کند.کاربردها: ساختمان داده‌ها برای ذخیره‌سازی داده‌ها به شکل سازمان‌یافته استفاده می‌شوند. از آنجا که داده‌ها حیاتی‌ترین موجودیت در علم کامپیوتر هستند، ارزش واقعی ساختمان داده‌ها روشن است. اهمیتی ندارد که کارشناس در حال حل چه مساله‌ای است، از هر رو به نوعی با داده سر و کار دارد.مسائل پیچیده: با استفاده از ساختمان داده‌ها، می‌توان مسائل پیچیده‌تر را حل کرد.تسلط بر الگوریتم ها و ساختمان داده ها ، یکی از مهارت های کلیدی برنامه نویسان حرفه ای است.آرایه در ساختمان داده ها :آرایه یک ساختمان داده ای است که به شما اجازه می دهد تا چندین مقدار را در یک متغیر نگه دارید. با استفاده از آرایه شما می توانید داده های خود را به صورت سازمان یافته و قابل دسترس نگه دارید. با استفاده از آرایه شما می توانید عملیات های مختلف را روی داده های خود انجام دهید. مانند : اضافه کردن ، حذف کردن ، جستجو کردن ، مرتب سازی و ... برای دسترسی به هر عنصر آرایه از اندیس مشخصی استفاده می شود.آرایه یک بعدی : مثلا :  ;int  a[5]  یعنی یک آرایه داریم به اسم a با 5 خانه که اندیس خانه ها از شماره 0 هستش تا 4 آرایه دو بعدی :مثلا : ;int  b[4][4]  یعنی آرایه ای داریم با 4 سطر و 4 ستون.اطلاعات در آرایه دو بعدی می تواند به صورت سطری یا ستونی ذخیره شود. آرایه می تواند به صورت سه بعدی یا چند بعدی نیز باشد. از آرایه ها برای ذخیره داده ها استفاده می شود. مثلا : اگر بخواهید تعدادی عدد را ذخیره کنید بنابر نیاز ، آن ها را در یک آرایه یک بعدی ، دو بعدی یا ... قرار داده ، سپس می توانید عملیات مرتب سازی ، جستجو ، پیدا کردن ، min یا max را بر روی آرایه انجام دهید.نحوه ذخیره عناصر آرایه در حافظه : عناصر آرایه در حافظه به صورت پشت سر هم قرار می گیرند که موجب سریع شدن سرعت دسترسی به عناصر آرایه می شود.الگوریتم جستجوی خطی ( Linear  Search ) در آرایه :  public static int Search(int[] array, int n, int x)
{
     for (int i = 0; i &lt; n; i++)
     {
         if (array[i] == x)
             return i;
     }
     return -1;
 }در این الگوریتم مقدار x را در آرایه n عنصری a ، به روش مقایسه با تک تک عناصر آرایه ، جستجو می کند. در صورت پیدا کردن اندیس خانه حاوی x و در صورت پیدا نکردن 1-  را بر میگرداند.مثال : پیاده سازی در #C    public static void Main()
{
       int[] array = { 17, 8, 13, 20, 6, 14 };
       int key = 13;

       // Function Call 
       int result = Search(array, array.Length, key);

       if (result == -1)
           Console.WriteLine(&amp;quotElement is not present in array&amp;quot);
       else
           Console.WriteLine(&amp;quotElement is present at index &amp;quot + result);
   }متغیر array نمرات دانشجویان در درس ساختمان داده ها را نشان می دهد. دنبال عدد 13 در آرایه هستیمint key;با استفاده از متغیر result تابع search را کال می کنیم ، اگر عنصر مورد نظر در آرایه نباشد مقدار 1-  در غیر این صورت عنصر مورد نظر را پیدا کرده و نتیجه را بر می گرداند یعنی index 2 </description>
                <category>آرزو باقری</category>
                <author>آرزو باقری</author>
                <pubDate>Wed, 07 Feb 2024 18:35:19 +0330</pubDate>
            </item>
            </channel>
</rss>