با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، با دوره کامل آموزش #C در خدمت شما دوستان هستیم . در بخش قبلی با مجموعه عمومی List آشنا شدید . در این بخش قصد داریم مجموعه عمومی SortedList در #C و دسترسی به عناصر SortedList در سی شارپ را به شما معرفی کنیم. یک مجموعه عمومی SortedList نشان دهنده مجموعه ای از جفت های کلید-مقدار است که بر اساس کلید مرتب شده اند.
یک مجموعه SortedList ترتیب عناصر را بر اساس کلید بصورت صعودی مرتب میکند و شامل رابطهای IDictionary و ICollection می باشد بنابراین می توانیم به وسیله کلید یا شماره اندیس و یا هر دو به عناصر دسترسی داشته باشیم.
SortedList<TKey,TValue>
#C شامل دو نوع Generic SortedList و Non-generic SortedList است. Generic SortedList با علامت های <> مشخص می شود که TKey برای نوع کلید و TValue برای نوع مقدار است. در SortedList غیر عمومی نوع کلید و مقادیر را مشخص نمی کنند.
SortedList در خود دو آرایه را نگه می دارد، یکی برای کلید ها و دیگری برای مقادیر. بنابراین هنگامی که یک جفت کلید-مقدار را به آن اضافه می کنید، جستجو باینری بر اساس کلید برای یافتن یک شماره اندیس مناسب برای ذخیره کلید و مقدار در آرایه های مربوطه انجام می شود. همچنین وقتی عناصر را از آن حذف می کنید دوباره عملیات مرتب سازی را انجام کی دهد .
شما می توانید مجموعه عمومی SortedList را با مشخص کردن نوع کلید و مقدار به صورت زیر نشان دهید.
1 | SortedList<int,string> mySortedList = new SortedList<int,string>(); |
در مثال بالا، mySortedList کلید نوع int و مقدار نوع string را نگه می دارد.
توضیحات | پراپرتی |
تعداد عناصری را که SortedList می تواند ذخیره کند، تنظیم کرده و یا آن برمی گرداند. | Capacity |
تعداد کل عناصر موجود در SortedList را برمی گرداند. | Count |
یک مقدار Boolean برمیگرداند که نشان می دهد آیا SortedList فقط خواندنی است یا خیر. | IsReadOnly |
مقدار یک عنصر را با کلید مشخص شده در SortedList تنظیم کرده و یا آن را برمی گرداند. | Item |
فهرست کلیدهای SortedList را برمی گرداند. | Keys |
فهرست مقادیر در SortedList را برمی گرداند. | Values |
توضیحات | متد |
جفت کلید-مقدار (key-value pairs) را به SortedList اضافه می کند. | Add |
عنصر را با استفاده از کلید مشخص حذف می کند. | Remove |
عنصر را با استفاده از شماره اندیس مشخص حذف می کند. | RemoveAt |
چک می کند که آیا کلید مشخص شده در SortedList وجود دارد یا خیر. | ContainsKey |
چک می کند که آیا مقدار مشخص شده در SortedList وجود دارد یا خیر. | ContainsValue |
تمام عناصر را از SortedList حذف می کند. | Clear |
شماره اندیس کلید مشخص شده در آرایه SortedList را بر می گرداند. | IndexOfKey |
شماره اندیس مقدار مشخص شده در آرایه SortedList را بر می گرداند. | IndexOfValue |
اگر مقدار مشخص شده در فهرست کلیدهای آرایه SortedList وجود داشته باشد true را برگردانده و مقدار را با کلید مشخص شده اختصاص می دهد، و اگر وجود نداشته باشد false را برمیگرداند. | TryGetValue |
از این متد برای اضافه کردن جفت های کلید-مقدار به یک SortedList استفاده می شود . کلید نمی تواند Null باشد، اما مقدار آن می تواند Null باشد. همچنین، نوع داده کلید و مقدار باید از همان نوع مشخص شده باشند، در غیر این صورت خطای کامپایل برگشت داده می شود.
void Add(TKey key, TValue value)
مثال زیر نشان می دهد که چگونه برای اضافه کردن جفت کلید-مقدار از متد Add استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | SortedList<int,string> sortedList1 = new SortedList<int,string>(); sortedList1.Add(3, "Three"); sortedList1.Add(4, "Four"); sortedList1.Add(1, "One"); sortedList1.Add(5, "Five"); sortedList1.Add(2, "Two"); SortedList<string,int> sortedList2 = new SortedList<string,int>(); sortedList2.Add("one", 1); sortedList2.Add("two", 2); sortedList2.Add("three", 3); sortedList2.Add("four", 4); // Compile time error: cannot convert from <null> to <int> // sortedList2.Add("Five", null); SortedList<double,int?> sortedList3 = new SortedList<double,int?>(); sortedList3.Add(1.5, 100); sortedList3.Add(3.5, 200); sortedList3.Add(2.4, 300); sortedList3.Add(2.3, null); sortedList3.Add(1.1, null); |
هرگاه عنصری در مجموعه SortedList اضافه شود این مجموعه به صورت خودکار عناصر را دوباره مرتب می کند. بنابراین حتی اگر آنها به صورت تصادفی اضافه شوند ، دوباره به صورت صعودی مرتب خواهند شد . تصویر زیر SortedList را در نمای debug نشان می دهد.
همانطور که می توانید در تصویر بالا مشاهده کنید، sortedList1 جفت های key-value را بر اساس کلید بصورت صعودی ذخیره می کند و sortedList2 عناصر را به ترتیب حروف الفبا کلیدها ذخیره می کند، حتی اگر آنها به ترتیب نباشند. sortedList3 نیز شامل نوع nullable int است ، به طوری که میتواند شامل مقدار null به عنوان یک مقدار باشد.
می توان از طریق شماره اندیس یا کلید به عناصر SortedList دسترسی پیدا کرد. برخلاف انواع دیگر مجموعه ها، در دسترسی به عناصر SortedList به کلید نیاز است . پس ، مطمئن شوید که کلید موجود در SortedList وجود دارد، در غیر این صورت استثناء KeyNotFoundException را برمیگرداند.
1 2 3 4 5 6 7 8 9 10 11 12 | SortedList<string,int> sortedList2 = new SortedList<string,int>(); sortedList2.Add("one", 1); sortedList2.Add("two", 2); sortedList2.Add("three", 3); sortedList2.Add("four", 4); Console.WriteLine(sortedList2["one"]); Console.WriteLine(sortedList2["two"]); Console.WriteLine(sortedList2["three"]); //Following will throw runtime exception: KeyNotFoundException Console.WriteLine(sortedList2["ten"]); |
خروجی :
1 2 3 | 1 2 3 |
همچنین میتوان با استفاده از حلقه های تکرار به مقادیر SortedList دسترسی داشت ، همانطور که در زیر نشان داده شده است:
1 2 3 4 5 6 7 8 9 10 | SortedList<string,int> sortedList2 = new SortedList<string,int>(); sortedList2.Add("one", 1); sortedList2.Add("two", 2); sortedList2.Add("three", 3); sortedList2.Add("four", 4); for (int i = 0; i < sortedList2.Count; i++) { Console.WriteLine("key: {0}, value: {1}", sortedList2.Keys[i], sortedList2.Values[i]); } |
خروجی :
1 2 3 4 | key: four, value: 4 key: one, value: 1 key: three, value: 3 key: two, value: 2 |
همچنین برای دسترسی مقادیر با استفاده از حلقه foreach باید از ساختار KeyValuePair به ثورت زیر استفاده کنیم :
1 2 3 4 5 6 7 8 | SortedList<string,int> sortedList2 = new SortedList<string,int>(); sortedList2.Add("one", 1); sortedList2.Add("two", 2); sortedList2.Add("three", 3); sortedList2.Add("four", 4); foreach(KeyValuePair<string,int> kvp in sortedList2 ) Console.WriteLine("key: {0}, value: {1}", kvp.Key , kvp.Value ); |
خروجی :
1 2 3 4 | key: four, value: 4 key: one, value: 1 key: three, value: 3 key: two, value: 2 |
اگر مطمئن نیستید که کلید خاصی وجود دارد یا نه از متد TryGetValue برای بازیابی مقدار کلید مشخص شده استفاده کنید. اگر کلید از وجود نداشته باشد، به جای آنکه یک استثناء را برگرداند، مقدار false را بازگشت می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SortedList<string,int> sortedList2 = new SortedList<string,int>(); sortedList2.Add("one", 1); sortedList2.Add("two", 2); sortedList2.Add("three", 3); sortedList2.Add("four", 4); int val; if (sortedList2.TryGetValue("ten",out val)) Console.WriteLine("value: {0}", val); else Console.WriteLine("Key is not valid."); if (sortedList2.TryGetValue("one",out val)) Console.WriteLine("value: {0}", val); |
خروجی :
1 2 | Key is not valid. value: 1 |
با استفاده از این متدها میتوان مقادیر را از مجموعه SortedList حذف کرد :
bool Remove(TKey key)
void RemoveAt(int index)
1 2 3 4 5 6 7 8 9 10 11 | SortedList<string,int> sortedList2 = new SortedList<string,int>(); sortedList2.Add("one", 1); sortedList2.Add("two", 2); sortedList2.Add("three", 3); sortedList2.Add("four", 4); sortedList2.Remove("one");//removes the element whose key is 'one' sortedList2.RemoveAt(0);//removes the element at zero index i.e first element: four foreach(KeyValuePair<string,int> kvp in sortedList2 ) Console.WriteLine("key: {0}, value: {1}", kvp.Key , kvp.Value ); |
خروجی :
1 2 | key: three, value: 3 key: two, value: 2 |
ContainsKey بررسی می کند که آیا کلید مشخص شده در SortedList وجود دارد یا نه.
bool ContainsKey(object key)
متد ContainsValue تعیین می کند که آیا مقدار مشخص شده در SortedList وجود دارد یا خیر.
bool ContainValue(object value)
1 2 3 4 5 6 7 8 9 10 11 12 | SortedList<string,int> sortedList = new SortedList<string,int>(); sortedList.Add("one", 1); sortedList.Add("two", 2); sortedList.Add("three", 3); sortedList.Add("four", 4); sortedList.Add("five", 5); sortedList.ContainsKey("One"); // returns true sortedList.ContainsKey("Ten"); // returns false sortedList.ContainsValue(2); // returns true sortedList.ContainsValue(6); // returns false |
شما می توانید از LINQ برای دسترسی و استفاده از عناصر مجموعه SortedList با استفاده از معیارهای مختلف استفاده کنید.
1 2 3 4 5 6 7 8 9 10 | SortedList<string,int> sortedList = new SortedList<string,int>(); sortedList.Add("one", 1); sortedList.Add("two", 2); sortedList.Add("three", 3); sortedList.Add("four", 4); sortedList.Add("five", 5); var result = sortedList.Where(kvp => kvp.Key == "two").FirstOrDefault(); Console.WriteLine("key: {0}, value: {1}", result.Key, result.Value); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="userclass">SortedList</span><<span class="kwrd">string</span>,<span class="kwrd">int</span>> sortedList = <span class="kwrd">new</span> <span class="userclass">SortedList</span><<span class="kwrd">string</span>,<span class="kwrd">int</span>>(); sortedList.Add(<span class="str">"one"</span>, 1); sortedList.Add(<span class="str">"two"</span>, 2); sortedList.Add(<span class="str">"three"</span>, 3); sortedList.Add(<span class="str">"four"</span>, 4); sortedList.Add(<span class="str">"five"</span>, 5); <span class="kwrd">var</span> query = <span class="kwrd">from</span> kvp <span class="kwrd">in</span> sortedList <span class="kwrd">where</span> kvp.Key == <span class="str">"two"</span> <span class="kwrd">select</span> kvp; <span class="kwrd">var</span> result = query.FirstOrDefault(); <span class="userclass">Console</span>.WriteLine(<span class="str">"key: {0}, value: {1}"</span>, result.Key, result.Value); |
خروجی :
1 | key: two, value: 2 |
در این بخش با نوعی دیگر از مجموعه های عمومی (Generic) در #C به نام SortedList آشنا شدید ، در بخش بعدی قصد داریم شما را با نوعی دیگر از این مجموعه ها به نام Dictionary آشنا کنیم.