در فصل های قبل مطالبی را در مورد کالکشن های غیر جنریک آموختیم. در سی شارپ میتوان از لیست های جنریک نیز بهره برد. در این فصل با کالکشن جنریک <List<T آشنا خواهیم شد.
کالکشن <List<T
در فصل های قبل مطالبی را در مورد ArrayList آموختید. یک ArrayList زمانی که مقداری به آن افزوده میشود، اندازه خود را افزایش میدهد. کالکشن <List<T عملکردی شبیه ArrayList دارد. با این حال <List<T یک کالکشن جنریک بوده و ArrayList یک کالکشن غیر جنریک است.
<List<T را می توان به دو روش زیر تعریف و نمونه سازی کرد :
List<int> intList = new List<int>();
//Or
IList<int> intList = new List<int>();
در نمونه مثال بالا اولین عبارت از متغیری با نوع List استفاده می کند و این در حالی است که عبارت دوم از متغیری با نوع IList
بهره می برد. <List<T اینترفیس <IList<T را پیاده سازی می کند. در برنامه نویسی به روش شی گرایی پیشنهاد میشود از اینترفیس ها به جای نوع های واقعی استفاده شود. این مورد می تواند در تست و نگهداری برنامه ها کمک قابل توجهی به ما بکند. بنابراین از <IList<T برای تعریف شی ایی از نوع <List<T استفاده کنید.
اضافه کردن عناصر به لیست
از متد ()Add
برای افزودن مقادیر به کالکشن مورد نظر خود استفاده کنید. نمونه مثال زیر مقادیر اعداد صحیح را به لیستی از نوع int
اضافه میکند :
IList<int> intList = new List<int>();
intList.Add(10);
intList.Add(20);
intList.Add(30);
intList.Add(40);
IList<string> strList = new List<string>();
strList.Add("one");
strList.Add("two");
strList.Add("three");
strList.Add("four");
strList.Add("four");
strList.Add(null);
strList.Add(null);
IList<Student> studentList = new List<Student>();
studentList.Add(new Student());
studentList.Add(new Student());
studentList.Add(new Student());
همچنین شما می توانید مقادیر را در زمان نمونهسازی به لیست خود اضافه کنید :
IList<int> intList = new List<int>(){ 10, 20, 30, 40 };
//Or
IList<Student> studentList = new List<Student>() {
new Student(){ StudentID=1, StudentName="Bill"},
new Student(){ StudentID=2, StudentName="Steve"},
new Student(){ StudentID=3, StudentName="Ram"},
new Student(){ StudentID=1, StudentName="Moin"}
};
متد ()AddRange
با استفاده از متد ()AddRange
می توان همه عناصر یک کالکشن را به کالکشن دیگری اضافه کرد. در نمونه مثال زیر مقادیر کالکشن intList۱
به کالکشن intList۲
اضافه شده است:
IList<int> intList1 = new List<int>();
intList1.Add(10);
intList1.Add(20);
intList1.Add(30);
intList1.Add(40);
List<int> intList2 = new List<int>();
intList2.AddRange(intList1);
نکته : متد ()AddRange
تنها بر روی کالکشن هایی با نوع <List<T کاربرد دارد. در اینجا نمی توان از <IList<T استفاده نمود.
دسترسی به عناصر لیست
با استفاده از متد foreach
و به شکل زیر میتوان آیتم های یک لیست را پیمایش کرد :
List<int> intList = new List<int>() { 10, 20, 30 };
intList.ForEach(el => Console.WriteLine(el));
اگر شما از نوع داده ای <IList<T برای متغیر خود استفاده کرده باشید از حلقه foreach
به شکل زیر برای پیمایش استفاده کنید :
IList<int> intList = new List<int>() { 10, 20, 30, 40 };
foreach (var el in intList)
Console.WriteLine(el);
خروجی نمونه مثال بالا به شکل زیر است :
10 20 30 40
میتوان به عناصر موجود در لیست با استفاده از مقادیر index
دسترسی پیدا کرد :
IList<int> intList = new List<int>() { 10, 20, 30, 40 };
int elem = intList[1]; // returns 20
برای به دست آوردن تعداد عناصر لیست میتوان از مشخصه Count
استفاده کرد :
برای به دست آوردن تعداد عناصر لیست میتوان از مشخصه Count استفاده کرد :
IList<int> intList = new List<int>() { 10, 20, 30, 40 };
Console.Write("Total elements: {0}", intList.Count);
خروجی نمونه مثال بالا به شکل زیر است :
Total elements: 4
میتوان از حلقه for
برای دسترسی به عناصر آرایه به شکل زیر استفاده نمود :
IList<int> intList = new List<int>() { 10, 20, 30, 40 };
for (int i = 0; i < intList.Count; i++)
Console.WriteLine(intList[i]);
خروجی نمونه مثال بالا به شکل زیر است :
10 20 30 40
<List<T اینترفیس <IList<T را پیاده سازی می کند. بنابراین <List<T می تواند به صورت ضمنی به <IList<T تبدیل شود :
static void Print(IList<string> list)
{
Console.WriteLine("Count: {0}", list.Count);
foreach (string value in list)
{
Console.WriteLine(value);
}
}
static void Main(string[] args)
{
string[] strArray = new string[2];
strArray[0] = "Hello";
strArray[1] = "World";
Print(strArray);
List<string> strList = new List<string>();
strList.Add("Hello");
strList.Add("World");
Print(strList);
}
خروجی نمونه مثال بالا به شکل زیر است :
Hello World Hello World
افزودن عناصر به لیست
با استفاده از متد ()Insert
می توان مقادیر را به لیست مورد نظر اضافه کرد :
IList<int> intList = new List<int>(){ 10, 20, 30, 40 };
intList.Insert(1, 11);// inserts 11 at 1st index: after 10.
foreach (var el in intList)
Console.Write(el);
خروجی نمونه مثال بالا به شکل زیر است :
10 11 20 30 40
حذف عناصر از لیست
با استفاده از متدهای ()Remove
و ()RemoveAt
می توان مقادیر را از یک کالکشن <List<T حذف کرد :
IList<int> intList = new List<int>(){ 10, 20, 30, 40 };
intList.Remove(10); // removes the 10 from a list
intList.RemoveAt(2); //removes the 3rd element (index starts from 0)
foreach (var el in intList)
Console.Write(el);
خروجی نمونه مثال بالا :
20 30
متد ()TrueForAll
()TrueForAll
متدی از کلاس <List<T است. این متد مقدار true
را در صورتی که شرط موردنظر صحیح باشد بر می گرداند و در غیر این صورت مقدار بازگشتی false
خواهد بود :
List<int> intList = new List<int>(){ 10, 20, 30, 40 };
bool res = intList.TrueForAll(el => el%2 == 0);// returns true
در نمونه مثال بالا در صورتی که مقادیر موجود در لیست همگی بر ۲ بخش پذیر باشند، مقدار true برگردانده میشود. این متد همچنین می تواند یک متد را به عنوان delegate
دریافت کند :
static bool isPositiveInt(int i)
{
return i > 0;
}
static void Main(string[] args)
{
List<int> intList = new List<int>(){10, 20, 30, 40};
bool res = intList.TrueForAll(isPositiveInt);
}