با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، با
دوره کامل آموزش
#C در خدمت شما دوستان هستیم . در بخش قبلی با نوعی از مجموعه
های عمومی (Generic) در
#C به نام SortedList آشنا شدید Dictionary در #C همان فرهنگ لغت انگلیسی است. فرهنگ لغت انگلیسی مجموعه ای از کلمات و تعاریف آنها است که ، در این بخش نیز قصد داریم شما را با نوعی دیگر از این مجموعه ها به نام
مجموعه عمومی Dictionary در #C و متدهای ContainsKey و Contains در سی شارپ آشنا کنیم.
اغلب به ترتیب حروف الفبا در یک یا چند زبان خاص قرار می گیرند. دیکشنری در #C نیز مجموعه ای از کلید ها و مقادیر است، بطوریکه کلید مانند کلمه است و مقدار مانند معنی است.
Dictionary یک مجموعه ی عمومی است که در فضای نام System.Collection.Generics موجود است. TKey نوع کلید و TValue نوع مقدار را نشان می دهند.
یک Dictionary را می توان با یک متغیر از رابط IDictionary و یا با یک کلاس Dictionary تعریف و مقداردهی اولیه کرد:
1 2 3 4 5 | IDictionary<int, string> dict = new Dictionary<int, string>(); //or Dictionary<int, string> dict = new Dictionary<int, string>(); |
در مثال فوق، در هنگام اعلام یک شیء dictionary ، نوع داده کلید و مقدار مشخص شده است. int نوع داده کلید و String نوعی داده مقدار است که در یک شیء dictionary به نام dict ذخیره می شوند. شما می توانید از هر نوع داده معتبر در #C برای کلید ها و مقادیر استفاده کنید.
توصیه می شود که شی dictionary را با استفاده از رابط IDictionary تعریف کنید .
نکته
: Dictionary نمیتواند شامل کلیدهای تکراری یا Null باشد، درحالیکه مقادیر میتوانند تکرار شود یا به صورت null تنظیم شود. کلید باید منحصر به فرد باشد در غیر اینصورت استثناء زمان اجرا برگشت داده خواهد شد.
توضیحات | پراپرتی |
تعداد کل عناصر موجود در Dictionary را برمی گرداند. | Count |
یک مقدار منطقی را برمی گرداند که نشان می دهد آیا Dictionary فقط خواندنی است یا خیر. | IsReadOnly |
مقدار عنصری را با کلید مشخص شده در Dictionary تنظیم می کند و یا آن را برمیگرداند. | Item |
بازگشت مجموعه کلید ها از Dictionary. | Keys |
بازگشت مجموعه مقادیر از Dictionary. | Values |
توضیحات | متد |
| Add |
| Remove |
چک میکند که آیا کلید مشخص شده در Dictionary وجود دارد یا خیر. | ContainsKey |
چک میکند که آیا مقدار مشخص شده در Dictionary وجود دارد یا خیر. | ContainsValue |
تمامی عناصر را از Dictionary حذف می کند. | Clear |
اگر مقدار مشخص شده در فهرست کلیدهای آرایه Dictionary وجود داشته باشد true را برگردانده و مقدار را با کلید مشخص شده اختصاص می دهد، و اگر وجود نداشته باشد false را برمیگرداند. | TryGetValue |
از این متد برای اضافه کردن جفت کلید-مقدار در dictionary استفاده می شود.
void Add(TKey, Tvalue)
1 2 3 4 | IDictionary<int, string> dict = new Dictionary<int, string>(); dict.Add(1,"One"); dict.Add(2,"Two"); dict.Add(3,"Three"); |
نمونه نوع IDictionary دارای یک overload اضافی برای متد Add است. که یک KeyValuePair <TKey، TValue> struct را به عنوان پارامتر می پذیرد.
1 2 3 4 5 6 7 | IDictionary<int, string> dict = new Dictionary<int, string>(); dict.Add(new KeyValuePair<int, string>(1, "One")); dict.Add(new KeyValuePair<int, string>(2, "Two")); //The following is also valid dict.Add(3, "Three"); |
همچنین می توان هنگام تعریف کردن Dictionary مقداردهی اولیه را نیز انجام داد.
1 2 3 4 5 6 | IDictionary<int, string> dict = new Dictionary<int, string>() { {1,"One"}, {2, "Two"}, {3,"Three"} }; |
عناصر Dictionary را می توان با متدهای مختلف ازجمله foreach و یا indexer مشاهده کرد.
همچنین میتوان از foreach به تمام عناصر Dictionary دسترسی پیدا کرد. Dictionary جفت کلید-مقدار را ذخیره می کند. بنابراین شما می توانید از نوع KeyValuePair در حلقه foreach استفاده کنید، همانطور که در زیر نشان داده شده است.
1 2 3 4 5 6 7 8 9 10 11 | Dictionary<int, string> dict = new Dictionary<int, string>() { {1,"One"}, {2, "Two"}, {3,"Three"} }; foreach (KeyValuePair<int, string> item in dict) { Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value); } |
حلقه for :
حلقه for :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Dictionary<int, string> dict = new Dictionary<int, string>() { {1,"One"}, {2, "Two"}, {3,"Three"} }; for (int i = 0; i < dict.Count; i++) { Console.WriteLine("Key: {0}, Value: {1}", dict.Keys.ElementAt(i), dict[ dict.Keys.ElementAt(i)]); } |
خروجی :
1 2 3 | Key: 1, Value: One Key: 2, Value: Two Key: 3, Value: Three |
میتوانیم از طریق کلید عنصر به مقدارش دسترسی داشته باشیم مانند زیر :
1 2 3 4 5 6 7 8 9 | Dictionary<int, string> dict = new Dictionary<int, string>() { {1,"One"}, {2, "Two"}, {3,"Three"} }; Console.WriteLine(dict[1]); //returns One Console.WriteLine(dict[2]); // returns Two |
خروجی :
1 2 | One Two |
در این روش Indexer کلید را به عنوان یک پارامتر می گیرد. اگر کلید مشخص شده وجود نداشته باشد، استثناء
KeyNotFoundException برگردانده می شود.
اگر شما در مورد کلید اطمینان ندارید، از متد TryGetValue استفاده کنید. متد TryGetValue اگر نتواند کلیدی را
پیدا کند، مقدار false را برگشت خواهد داد.
bool TryGetValue(TKey key, out TValue value)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Dictionary<int, string> dict = new Dictionary<int, string>() { {1,"One"}, {2, "Two"}, {3,"Three"} }; string result; if(dict.TryGetValue(4, out result)) { Console.WriteLine(result); } else { Console.WriteLine("Could not find the specified key."); } |
خروجی :
1 | Could not find the specified key. |
Dictionary شامل متدهای مختلف برای تعیین اینکه آیا یک Dictionary شامل عناصر یا کلید های مشخص شده است یا خیر. از
متد ContainsKey برای بررسی اینکه آیا یک کلید مشخص شده در Dictionary وجود دارد یا خیر، استفاده میکنیم.
از متد Contains نیز برای بررسی اینکه آیا یک عنصر مشخص در Dictionary وجود دارد یا خیر ، استفاده می کنیم.
bool ContainsKey(TKey key)
bool Contains(KeyValuePair<TKey, TValue> item)
1 2 3 4 5 6 7 8 9 10 | Dictionary<int, string> dict = new Dictionary<int, string>() { {1,"One"}, {2, "Two"}, {3,"Three"} }; dict.ContainsKey(1); // returns true dict.ContainsKey(4); // returns false dict.Contains(new KeyValuePair<int,string>(1,"One")); // returns true |
متد Contains دارای overload دیگری نیز است که IEqualityComperer را به عنوان پارامتر دوم می گیرد. به مثال زیر دقت
کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | public class Student { public int StudentID { get; set; } public string StudentName { get; set; } } class StudentDictionaryComparer : IEqualityComparer<KeyValuePair<int,Student>> { public bool Equals(KeyValuePair<int, Student> x, KeyValuePair<int, Student> y) { if (x.Key == y.Key && (x.Value.StudentID == y.Value.StudentID) && (x.Value.StudentName == y.Value.StudentName)) return true; return false; } public int GetHashCode(KeyValuePair<int, Student> obj) { return obj.Key.GetHashCode(); } } class Program { static void Main(string[] args) { IDictionary<int, Student> studentDict = new Dictionary<int, Student>() { { 1, new Student(){ StudentID =1, StudentName = "Bill"}}, { 2, new Student(){ StudentID =2, StudentName = "Steve"}}, { 3, new Student(){ StudentID =3, StudentName = "Ram"}} }; Student std = new Student(){ StudentID = 1, StudentName = "Bill"}; KeyValuePair<int, Student> elementToFind = new KeyValuePair<int, Student>(1, std); bool result = studentDict.Contains(elementToFind, new StudentDictionaryComparer()); // returns true Console.WriteLine(result); } } |
خروجی :
1 | true |
در مثال بالا از StudentDictionaryComparer استفاده کرده ایم که IEqualityComparer را برای مقایسه شی دانش آموز در
Dictionary می گیرد. مقادیر پیش فرض فقط به انواع داده اولیه کار می کنند.
از این متد برای حذف یک آیتم موجود در dictionary استفاده می کنیم . متد Remove دارای دو overload است، در یکی کلید را
می پذیرد و در یکی دیگر KeyValuePair را به عنوان پارامتر قبول می کند.
bool Remove(TKey key)
bool Remove(KeyValuePair<TKey,TValue>)
1 2 3 4 5 6 7 8 | Dictionary<int, string> dict = new Dictionary<int, string>() { {1,"One"}, {2, "Two"}, {3,"Three"} }; dict.Remove(1); // removes the item which has 1 as a key |
هر کلید و مقدار باید برای حذف یک مورد مطابقت داشته باشد. اگر هر دو با هم همخوانی نداشته باشند، مورد حذف نخواهند شد.
به عنوان مثال، مثال زیر هیچ موردی را حذف نمی کند:
1 | dict.Remove(new KeyValuePair<int, string>(2, "Two1")); |
در این بخش با مجموعه عمومی dictionary زبان #C آشنا شدید ، در بخش بعدی قصد داریم در رابطه با Partial Class در این
زبان صحبت کنیم.
بدون نام
خیلی خوب و کاربردی . مرسییییی