با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش #c ، را دنبال می کنند. در بخش قبلی با نوعی از مجموعه های غیر عمومی به نام ArrayList آشنا شدید. در این قسمت قصد داریم شما را با نوعی دیگر از مجموعه های غیر عمومی نام SortedList در #C آشنا کنیم.
مجموعه SortedList در سی شارپ عناصر خود را به ترتیب صعودی بر اساس مقدار کلید ،ذخیره می کند.
کلاس SortedList در رابط های IDictionary و ICollection وجود داشته و میتوان به عناصر توسط کلید و شماره اندیس دسترسی پیدا کرد.
#C دارای دو نوع ، Generic SortedList و Non-Generic SortedList است ، در اینجا ما در مورد Non-Generic SortedList صحبت می کنیم .
توضیحات | پراپرتی |
تعیین یا بازگشت تعداد عناصری که SortedList می تواند ذخیره کند . | Capacity |
تعداد عناصر موجود در SortedList را بازگشت میدهد. | Count |
نشان می دهد که آیا لیست مرتب شده دارای اندازه ثابت است یا خیر. که اگر true باشد نشان دهنده اینست که لیست دارای سایز ثابتی است. | IsFixedSize |
نشان می دهد که آیا SortedList فقط خواندنی است یا خیر. دو مقدار true و false را برمی گرداند. | IsReadOnly |
تعیین یا بازگشت مقدار عنصر بر اساس کلید مشخص شده در SortedList . | Item |
بازگشت لیست کلیدهای SortedList | Keys |
بازگشت لیست مقدارهای SortedList | Values |
توضیحات | متد |
عنصری شامل کلید و مقدار را به SortedList اضافه می کند. | Add(object key, object value) |
عنصر را بر اساس کلید مشخصی حذف می کند. | Remove(object key) |
عنصر را بر اساس اندیس مشخصی حذف می کند. | RemoveAt(int index) |
جستجو بر اساس کلید مشخص شده در SortedList . | Contains(object key) |
تمام عناصر را از SortedList حذف می کند. | Clear() |
مقدار را براساس شماره اندیس ذخیره شده در SortedList به دست می آورد. | GetByIndex(int index) |
کلید را براساس شماره اندیس ذخیره شده در SortedList به دست می آورد. | GetKey(int index) |
شماره اندیس کلید را براساس کلید ذخیره شده در SortedList به دست می آورد. | IndexOfKey(object key) |
شماره اندیس مقدار را براساس مقدار ذخیره شده در SortedList به دست می آورد. | IndexOfValue(object value) |
از متد Add برای اضافه کردن عناصر بهمراه مقدار و کلید به SortedList استفاده می کنیم.
پارامتر کلید نمی تواند null باشد، اما مقدار می تواند null باشد. همچنین، نوع داده کلیه کلیدها باید یکسان باشد، به طوری که بشود بهم مقایسشان کرد، در غیر اینصورت، کامپایلر خطا بازگشت میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SortedList sortedList1 = new SortedList(); sortedList1.Add(3, "Three"); sortedList1.Add(4, "Four"); sortedList1.Add(1, "One"); sortedList1.Add(5, "Five"); sortedList1.Add(2, "Two"); SortedList sortedList2 = new SortedList(); sortedList2.Add("one", 1); sortedList2.Add("two", 2); sortedList2.Add("three", 3); sortedList2.Add("four", 4); SortedList sortedList3 = new SortedList(); 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 حذف می کنید، بقیه عناصر دوباره مرتب می شوند.
لطفا توجه داشته باشید که sortedList2 کلید را به ترتیب حروف الفبا انگلیسی در تصویر بالا مرتب کرده است.
کلید SortedList می تواند از هر نوع داده باشد، اما باید همه کلید ها از یک نوع باشند.
مثال زیر، خطای زمان اجرا را بازمی گرداند:
1 2 3 4 5 6 7 | SortedList sortedList = new SortedList(); sortedList.Add(3, "Three"); sortedList.Add("Four", "Four"); // Throw exception: InvalidOperationException sortedList.Add(1, "One"); sortedList.Add(8, "Five"); sortedList.Add(2, "Two"); |
می توان به عناصر SortedList بر اساس اندیس یا کلید دسترسی پیدا کرد. بر خلاف سایر مجموعه ها،در SortedList میتوان از کلید به جای شماره اندیس برای دسترسی به یک مقدار استفاده کرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 | SortedList sortedList = new SortedList(); sortedList.Add("one", 1); sortedList.Add("two", 2); sortedList.Add("three", 3); sortedList.Add("four", "Four"); int i = (int) sortedList["one"]; int j = (int) sortedList["two"]; string str = (string) sortedList["four"]; Console.WriteLine(i); Console.WriteLine(j); Console.WriteLine(str); |
خروجی :
1 2 3 | 1 2 Four |
توجه: مجموعه غیر عمومی SortedList می تواند عناصری با کلید و مقدار هر نوع داده ای را داشته باشد. بنابراین مقادیر باید به نوع داده مناسب تبدیل شوند ، در غیر این صورت خطای کامپایل زمان اجرا برگشت داده می شود.
میتوان با استفاده از حلقه های تکرار نیز به مقادیر عناصر مجموعه دسترسی داشته باشیم:
1 2 3 4 5 6 7 8 9 10 11 | SortedList sortedList2 = new SortedList(); 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.GetKey(i), sortedList2.GetByIndex(i)); } |
خروجی :
1 2 3 4 | key: four, value: 4 key: one, value: 1 key: three, value: 3 key: two, value: 2 |
میتوان از foreach هم برای دسترسی به مجموعه SortedList استفاده کرد . عنصر SortedList شامل هر دو کلید و مقدار است.
توجه داشته باشید که نوع عنصر در حلقه foreach باید DictionaryEntry باشد.
1 2 3 4 5 6 7 8 | SortedList sortedList1 = new SortedList(); sortedList1.Add("one", 1); sortedList1.Add("two", 2); sortedList1.Add("three", 3); sortedList1.Add("four", 4); foreach(DictionaryEntry kvp in sortedList1 ) 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 |
از این متدها برای حذف عناصر SortedList استفاده می کنیم :
1 2 3 4 5 6 7 8 9 10 11 | SortedList sortedList1 = new SortedList(); sortedList1.Add("one", 1); sortedList1.Add("two", 2); sortedList1.Add("three", 3); sortedList1.Add("four", 4); sortedList1.Remove("one");//removes element whose key is 'one' sortedList1.RemoveAt(0);//removes element at zero index i.e first element: four foreach(DictionaryEntry kvp in sortedList1 ) Console.WriteLine("key: {0}, value: {1}", kvp.Key , kvp.Value ); |
خروجی :
1 2 | key: three, value: 3 key: two, value: 2 |
متدهای Contains و ContainKey تعیین می کند که آیا کلید مشخص شده در مجموعه SortedList وجود دارد یا خیر.
همچنین ممتد ContainsValue تعیین می کند که آیا مقدار مشخص شده در SortedList وجود دارد یا خیر.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | SortedList sortedList = new SortedList(); sortedList.Add(3, "Three"); sortedList.Add(2, "Two"); sortedList.Add(4, "Four"); sortedList.Add(1, "One"); sortedList.Add(8, "Five"); sortedList.Contains(2); // returns true sortedList.Contains(4); // returns true sortedList.Contains(6); // returns false sortedList.ContainsKey(2); // returns true sortedList.ContainsKey(6); // returns false sortedList.ContainsValue("One"); // returns true sortedList.ContainsValue("Ten"); // returns false |
در این قسمت با نوعی از مجموعه های غیر عمومی (non-generic) به نام SortedList در زبان #C آشنا شدید.
در قسمت بعدی شما را با نوعی دیگر از این مجموعه ها به نام Stack (پشته) آشنا خواهیم کرد.