ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل دهم کلاسهای کلکسیون در#C

<!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

فصل دهم

C# کلاسهای کلکسیون در

آنچه که در این فصل یاد خواهید گرفت:

کلکسیونها و نحوهی استفاده از آنها برای نگهداشتن مجموعهای از دادهها

تفاوت مابین آرایهها و کلکسیونها

انواع مختلفی از کلکسیونها(پشته، صف،..)

آشنایی با متدهای عمومی کلکسیونها

آرایهها مفید هستند، اما آنها محدودی ت های خودشان را دارن د . با این وجود، آرای ه ها تنها راه جمع آوری داد ه های هم نوع

چندین کلاس برای جم ع آوری عناصر با هم بوسیل ه ی روشهای دیگری فراهم م ی سازد . اینها NET. هستند. چارچوب

قرار دارند. System.Collections کلاسهای کلکسیون 1 هستند و در فضای نامی

1- شکل 10

پذیرفته، نگه داشته و بر م ی گردانند. یعنی نوع داد ه ی عناصر object کلاسهای پایه ی کلکسیون عناصر خود را بصورت

نوع مقدار ی ) با یک ) int است . برای درک این مفهوم، مقایس ه ی یک آرایه از متغیرهای object داخل کلاس کلکسیون

یک نوع داد ه ی مقداری است، این آرایه، مقادیر متغیرها int نوع داده ی ارجاعی ) یاری دهنده اس ت . چون ) object آرایه از

1 میبینید). - را مستقیما نگه میدارد ( همانطور که در شکل 10

1 Collection

Mohsen_mahyar@yahoo.com

150

باشد، چه تاثیری دار د . شما هنوز م ی توانید مقادیر صحیح را به این آرایه object حال بررسی کنید اگر عناصر آرایه از نوع

اضافه کنید ( میتوانید مقادیری از هر نوع را اضافه کنی د ). زمانی که یک مقدار صحیح اضافه م ی کنید، آن مقدار بطور

اتوماتیک جعبه بندی می شود و هر عنصر آرایه (یک ارجاع به ش ی ) به کپی جعب ه بندی شده ی مقدار صحیح اشاره م ی کند .

2 نمایش داده میشود. - این عمل در شکل 10

2- شکل 10

است. یعنی در زمان درج یک مقدار به یک کلکسیون، آن object به خاطر دارید که نوع دادهی عناصر یک کلکسیون

مقدار جعبهبندی می شود و زمانی که یک مقدار را از کلکسیون میخوانید، باید با استفاده از قالب بندی آن را از جعبه در

آورید. بخشهای بعدی یک مرور کوتاه روی 4 کلاس بسیار مفید فراهم میکنند. برای جزئیات بیشتر با مستندات چارچوب

مراجعه کنید. NET.

ArrayList -1-10 کلاس

یک کلاس مفید برای مخلوط کردن عناصر در یک آرایه اس ت . این کلاس امکانات مناسبی دارد که آ ر ایه ی ArrayList

معمولی ____________از آنها محروم است.

اگر بخواهید یک آرایه را تغییر اندازه دهید، باید آرای ه ی جدیدی ایجاد کرده و عناصر آن را کپی کنید و سپس

ارجاعهای آرایه را بروز کنید.

اگر بخواهید یک عنصر را از آرایه حذف کنید، باید یک کپی از آن عنصر ایجاد کنید و عناصر بعد از آ ن را به یک

خانه قبلی خود جابجا کنید. نه تنها این عمل کند میباشد، بلکه از عنصر آخری دو کپی داریم.

اگر بخواهید یک عنصر به آرایه درج کنید، باید همه عناصر را یک خانه به جلو جابجا کرده و عنصر جدید را در خانه

میانی درج کنید. در این حالت آخرین عنصر را از دست میدهید.

میتوانید به این محدودیتها چیره شوید. ArrayList • در اینجا با استفاده از کلاس

بطور اتوماتیک عناصر ArrayList . حذف کنید ArrayList می توانید یک عنصر از Remove • با استفاده از متد

خود را مجددا مرتب میسازد.

بکار برید. ArrayList برای طی کردن سراسر یک foreach را در یک حلقهی Remove توجه: نمیتوانید متد

اضافه کنی د . شما عنصر مورد نظر جهت اضافه ArrayList می توانید یک عنصر به انتهای Add • با استفاده از متد

در صورت نیاز خودش را تغییر اندازه میدهد. ArrayList شدن را تهیه میکنید و

فصل نهم-ساختارها

151

ArrayList ، درج کنی د . در صورت نیاز ArrayList می توانید یک عنصر میان عناصر Insert • با استفاده از متد

اندازهی خودش را تغییر میدهد.

را نشان میدهد. ArrayList 1 نحوهی ایجاد، دستکاری و طیکردن سراسر محتویات یک - مثال 10

1- مثال 10

using System;

using System.Collections;

...

ArrayList numbers = new ArrayList();

...

// fill the ArrayList

foreach (int number in new int[12]{10,9,8,7,7,6,5,10,4,3,2,1})

{

numbers.Add(number);

}

...

// remove first element whose value is 7 (the 4th element, index 3)

numbers.Remove(7);

// remove the element that's now the 7th element, index 6 (10)

numbers.RemoveAt(6);

...

// iterate remaining 10 elements using a for statement

for (int i = 0; i != numbers.Count; i++)

{

int number = (int)numbers[i]; // Notice the cast

Console.WriteLine(number);

}

...

// iterate remaining 10 using a foreach statement

foreach (int number in numbers) // No cast needed

{

Console.WriteLine(number);

}

کد را اجرا کرده و خروجی آن را مشاهده کنید.

بدست آور د. در آرایه از خصوصیت Count توجه: می توان تعداد عناصر داخل یک کلکسیون را با خصوصیت

استفاده می شود. Length

Queue -2-10 کلاس

اولین ورودی -اولین خروجی ) را پیاده سازی می کند. یک عنصر جدید به انتهای صف درج ) FIFO یک مکانیزم Queue کلاس

2 از صف و عملیات آن است. - مثال 10 .(Dequeue) و از جلوی صف حذف میشود (Enqueue میشود( عمل

2- مثال 10

using System;

using System.Collections;

...

Queue numbers = new Queue();

...

// fill the queue

foreach (int number in new int[4]{9, 3, 7, 2})

{

numbers.Enqueue(number);

Console.WriteLine(number + " has joined the queue");

}

...

Mohsen_mahyar@yahoo.com

152

// iterate through the queue

foreach (int number in numbers)

{

Console.WriteLine(number);

}

...

// empty the queue

while (numbers.Count != 0)

{

int number = (int)numbers.Dequeue();

Console.WriteLine(number + " has left the queue");

}

برنامه را اجرا کرده و خروجی آن را مشاهده کنید.

Stack -3-10 کلاس

اولین ورودی -آخرین خروجی ) را پیاده سازی می کند. یک عنصر به بالای پشته اضافه )LIFO یک مکانیزم Stack کلاس

برای درک تصویری، یک پشته از سینی ها را در .(Pop و یک عنصر از بالای پشته حذف م ی شود ( عمل (Push میشود (عمل

نظر بگیرید . سینیهای جدید به بالا اضافه م ی شوند و سین ی ها از بالا برداشته م ی شوند. پس آخرین سینی گذاشته شده،

3 کار پشته را نشان میدهد. - اولین سینی است که برداشته خواهد شد. مثال 10

3- مثال 10

using System;

using System.Collections;

...

Stack numbers = new Stack();

...

// fill the stack

foreach (int number in new int[4]{9, 3, 7, 2})

{

numbers.Push(number);

Console.WriteLine(number + " has been pushed on the stack");

}

...

// iterate through the stack

foreach (int number in numbers)

{

Console.WriteLine(number);

}

...

// empty the stack

while (numbers.Count != 0)

{

int number = (int)numbers.Pop();

Console.WriteLine(number + "has been popped off the stack");

}

برنامه را اجرا کرده و خروجی را مشاهده کنید.

HashTable -4-10 کلاس

یک روش برای نگاشت یک اندیس به یک عنصر فراهم م ی کنند. شما یک عدد صحیح را به ArrayList انواع داده ی آرایه و

عنوان اندیس در داخل کروشه باز و بسته قرار میدهید.

فصل نهم-ساختارها

153

شاید در بعضی مواقع لازم باشد یک نو ع داده ی غیر صحیح همچون رشته، تاریخ یا عدد اعشاری را به یک مقدار دیگر

نگهداری دو آرایه از نوع HashTable نگاشت کنید . در زبان های دیگر، این یک آرایه انجمن ی 1 خوانده م ی شود . کلاس

برای این عمل فراهم م ی سازد. یکی از آرای ه ها برای نگه داشتن کلیدهای نگاشت و دیگری آرایه ای برای نگ ه داری object

درج م ی کنید، آن بطور اتوماتیک، کلید را به Hash مقادیر نگاشت شده اس ت . زمانی که یک زوج کلی د /مقدار را به جدول

مقدار مورد نظر مرتبط م ی سازد و شما را برای بازیابی مقدار تخصیص یافته به کلید قادر م ی سازد . چندین پیامد مهم از

وجود دارد: HashTable طراحی

را برای اضافه کردن یک کلید بکار برید و این Add نمی تواند کلید تکراری داشته باش د . اگر متد HashTable • یک

کلید در آرای ه ی کلیدها موجود باشد، یک استثناء رخ م ی دهد . ولی اگر از علامت [] برای اضاف ه کردن زوج

کلید/مقدار استفاده کنید، در صورت بودن ک ل ید، فقط مقدار مربوط به آن کلید را بروز م ی کند. می توانید با متد

را آزمایش کنید. HashTable وجود یک کلید در ContainKey

بکار م ی برید، یک مقدار از نوع HashTable را برای ط ی کردن یک foreach • زمانی که یک دستور

دسترسی به عناصر کلید و مقادیر دو آرایه DictionaryEntry برگردانده م ی شود. کلاس DictionaryEntry

فراهم میسازد. Value و Key را با خصوصیتهای

4، سن اعضای خانواده را به اسامی آنها اختصاص میدهد و سپس آنها را در خروجی چاپ میکند. - مثال 10

4- مثال 10

using System;

using System.Collections;

...

Hashtable ages = new Hashtable();

...

// fill the SortedList

ages["John"] = 41;

ages["Diana"] = 42;

ages["James"] = 13;

ages["Francesca"] = 11;

...

// iterate using a foreach statement

// the iterator generates a DictionaryEntry object containing a key/value pair

foreach (DictionaryEntry element in ages)

{

string name = (string)element.Key;

int age = (int)element.Value;

Console.WriteLine("Name: {0}, Age: {1}", name, age);

}

خروجی این برنامه به صورت زیر است:

Name: James, Age: 13

Name: John, Age: 41

Name: Francesca, Age: 11

Name: Diana, Age: 42

SortedList -5-10 کلاس

است . آن اختصاص دادن کلیدها به مقادیر را مجاز م ی دارد. تفاوت این HashTable بسیار شبیه کلاس SortedList کلاس

درج م ی کنید، کلید در SortedList است که آرایهی کلیدها همواره مرتب شده اس ت . زمانی که یک زوج مقدا ر /کلید به

اندیس مناسبی از آرای ه ی کلیدها درج م ی شود تا این آرایه همچنان مرتب شده بماند و مقدار مرتبط با آن کلید نیز در همان

1 Associative

Mohsen_mahyar@yahoo.com

154

ترازبندی اتوماتیک کلی د ها ومقادیر را تضمین م ی کند( حتی زمانی SortedList اندیس از آرایه مقادیر قرار م ی گیرد. کلاس

اضافه SortedList که عناصری را حذف یا درج کنی د ). یعنی، شما م ی توانید زوج مقدا ر /کلید را با هر ترتیب دلخواه خود به

کنید، آنها بر اساس مقادیر کلیدها مرتب میشوند.

foreach نمی تواند کلیدهای تکراری داشته باش د . زمانی که یک دستور SortedList یک ،HashTable شبیه کلاس

برگردانده می شود. با این وجود، DictionaryEntry استفاده م ی کنید، یک SortedList برای طی کردن سراسر یک

مرتب شده هستند. Key برگردانده شده براساس خصوصیت DictionaryEntry اشیاء

5، سن اعضای یک خانواده را به اسامی آنها اختصاص م ی دهد و سپس آنها را چاپ م ی کند . البته به جای - مثال 10

بکار میبرد. SortedList یک HashTable

5- مثال 10

using System;

using System.Collections;

...

SortedList ages = new SortedList();

...

// fill the SortedList

ages["John"] = 3V;

ages["Diana"] = 40;

ages["James"] = 12;

ages["Francesca"] = 10;

...

// iterate using a foreach statement

// the iterator generates a DictionaryEntry object containing a key/value pair

foreach (DictionaryEntry element in ages)

{

string name = (string)element.Key;

int age = (int)element.Value;

Console.WriteLine("Name: {0}, Age: {1}", name, age);

}

خروجی این برنامه بر اساس اسامی اعضای خانواده مرتب میشوند.

Name: Diana, Age: 40

Name: Francesca, Age: 10

Name: James, Age: 12

Name: John, Age: 39

BitArray -6-10 کلاس

false و 0 به معنی true از مقادیر بیتی تشکیل شده اس ت . مقدار بیت ها 1 و 0 هستند که 1 به معنی BitArray کلاس

1 متدها و خصوصیات خاص - است. این کلاس مفهوم کاراتری از ذخیره و بازیابی مقادیر بیتی فراهم م ی کند . جدول 10

را لیست میکند. BitArray

BitArray 1 اعضای کلاس - جدول 10

نام عضو گرامر

می شو د . اینها چند تا از overload ، سازندهی این کلاس

های آن هستند. overLoad

(BitArray(bool[] bits

(BitArray(int[] bits

(BitArray(int count,bool default

فصل نهم-ساختارها

155

بیتی روی شی جاری و پارامتر And این متد یک عمل :And

قرار داده BitArray انجام م ی دهد و نتیجه در BitArray

میشود.

(BitArray And(BitArray value

(Bool Get(int index . را برمیگرداند BitArray این متد مقدار یک بیت خاص از :Get

true اگر کلکسیون فقط خواندنی باشد مقدار :IsReadOnly

بر میگرداند. false برمیگرداند، در غیر اینصورت

virtual bool IsReadOnly

{;get}

ین خصوصیت مقدار یک بیت از اندیس خاص را بدست :Item

آورده یا مقداردهی میکند.

[virtual object this [int index

}

;get; set

{

تعداد بیت های موجود در کلکسیون را بدست آورده یا :Length

مقداردهی میکند.

} public int length

;get;set

{

این متد بی ت های کلکسیون را مکمل 1 می کند. این نتیجه :Not

برگردانده میشود. BitArray در

()BitArray Not

و شی BitArray بیتی روی پارامتر or این متد یک عمل :Or

برگردانده میشود. BitArray جاری انجام میدهد. نتیجه در

(BitArray Or(BitArray value

(void Set(int index, bool value . یک بیت خاصی را مقداردهی میکند :Set

false یا true این متد همه بی ت های کلکسیون را :SetAll

قرار میدهد.

(Void SetAll(bool value

xor عمل BitArray این متد روی شی جاری و پارامتر :Xor

بیتی انجام میدهد.

(BitArray Xor(BitArray value

را پیادهسازی میکند. ()GetEnumerator متد IEnumerable اعضای

را پیادهسازی میکند. ()Clone متد IClonable اعضای

و IsSysnchronized ،Count ،CopyTo() ICollection اعضای

را در بر دارد. SyncRoot

دارد که ثبت نام BitArray یک کلاس Employee را نشان م ی دهد. کلاس BitArray 6 یک کاربرد از کلاس - مثال 10

false یا true کارمند در برنام ه های مختلف را پ ی گیری می کند( همچون طرح سلامت و ....). چون ثبت نام فقط دو حالت

خصوصیاتی برای خواندن یا مقداردهی ثبت نام در ،Employee دارد، پس م ی توان از این کلکسیون استفاده کر د . در کلاس

برنامه های مختلف فراهم شده است  .

6- مثال 10

using System;

Mohsen_mahyar@yahoo.com

156

using System.Collections;

namespace Arshia.CsharpBook{

public class Starter{

public static void Main(){

Employee ben=new Employee();

ben.InProfitSharing=false;

ben.InHealthPlan=false;

Employee Valerie=new Employee();

Valerie.InProfitSharing=false;

Participation("Ben",ben);

Participation("Valerie",Valerie);

}

public static void participation(string name, Employee person)

{

Console.WriteLine(name+":");

if (person.InProfitSharing)

{

Console.WriteLine("participating in "+ "Profit Sharing");

}

if (person.InHealthPlan)

{

Console.WriteLine("participating in "+"Health Plan");

If (person.InCreditUnion)

{

Console.WriteLine("participating in " + "Credit Union");

}

}

}

public class Employee

{

public Employee()

{

eFlags.SetAll(true);

}

private BitArray eFlags=new BitArra(3);

public bool InProfitSharing

{

set

{

eFlags.Set(0,value);

}

get

{

return eFlags.Get(0);

}

public bool InHealthPlan

{

set

{

eFlags.Set(1,value);

}

get{

return eFlags.Get(1);

}

public bool InCreditUnion

{

set

{

eFlags.Set(2,value);

}

get

{

فصل نهم-ساختارها

157

return eFlags.Get(2);

}

}

}

}

-7-10 مقایسه ی آرایه ها و کلکسیونها

موارد زیر خلاصهای از تفاوتهای مهم مابین آرایهها و کلکسیونها هستند.

نوع داده ی عناصر نگه داشته شده در یک آرایه اعلان م ی شود، در حالیکه کلکسیون این کار را انجام نم ی دهد. بدین

ذخیره میکنند. object دلیل که کلکسیونها اعضاء خود را بصورت

یک آرایه انداز ه ی ثابت دارد و نم ی تواند بزرگ یا کوچک شو د . یک کلکسیون م ی تواند بطور اتوماتیک انداز ه ی خود

را تغییر دهد.

آرایه یک ساختار خواندن ی /نوشتنی است . هیچ روشی برای ایجاد آرای ه ی فقط خواندنی نیس ت . با این وجود، کاربرد

را فراهم میسازند. ReadOnly کلکسیونها در متد فقط خواندنی امکان پذیر است. این کلاسها متد

-8-10 کاربرد کلاسهای کلکسیون برای بازی کارتها

این بخش یک برنام ه ی کاربردی را شرح م ی دهد که تخصیص یک بسته کارت به چهار بازیکن را شبی ه سازی می کند. کارتها

در بسته هستند یا در اختیار یکی از چهار بازیکن هستن د . بسته و کار ت های موجود در دست بصورت اشیائی از نوع

پیاده سازی می شوند. شاید فکر کنید اینها باید بصورت یک آرایه پیاد ه سازی شوند . همواره 52 کارت در بسته ArrayList

و 13 کارت در دست وجود دار د . این درست است، اما از این حقیقت چش م پوشی می کند، زم انی که کار ت ها به دست بازیکنان

داده می شود، آنها در بسته نخواهند بو د . اگر یک آرایه برای پیاد ه سازی یک بسته بکار برید، شما مجبور هستید تعداد

کارتهای نگه داشته شده در دست بازیکنان را ثبت کنی د . بطور مشابه، زمانی که کار ت ها از دست بازیکنان به بسته

برگردانده میشوند، باید کارتهای موجود در دست بازیکنان را نیز ثبت کنید.

-9-10 خلاصه

نگه میدارند. object • کلکسیونها اشیایی از نوع

کلکسیونها بسیاری از محدودیتهای آرایهها را حذف میکنند.

وجود ____________دارند. FCL • برخی از ساختماندادهها به صورت کلکسیونهای آماده در

هنگام اضافهکردن یک عنصر به کلکسیون، آن بطور اتوماتیک جعبهبندی میشود. در هنگام استفاده از عناصر

داخل کلکسیون، باید آنها را صریحا از جعبه در آورد.

اندازهی کلکسیونها برخلاف آرایهها قابل تغییر است.

 

Mohsen_mahyar@yahoo.com

 

   + MOHSEN GHASEMI - ٩:٢٥ ‎ق.ظ ; ۱۳۸٩/٤/۱٠