PDA

View Full Version : سوال: کاربرد لیست پیوندی و دیکشنری



sara125
سه شنبه 27 خرداد 1393, 20:02 عصر
سلام دوستان
من به تازگی شروع به یادگیری collection های سی شارپ کردم که اول از لیست شروع کردم و حالا رفتم سراغ لیست پیوندی. اما نمی دونم که لیست پیوندی چه مزیتی نسبت به list داره؟
اگر مثل هم هستن که دیگه نیازی نیست یاد بگیرم.
میخواستم بدونم لیست پیوندی چه مزیتی نسبت به list داره و آیا مواردی هست که فقط باید از لیست پیوندی استفاده کرد و collectionهای دیگه رو نشه بکار برد؟
البته همین سوالو هم در مورد dictionary و hashTable دارم.
ممنون میشم دوستانی که اطلاعاتی در این زمینه دارن منو راهنمایی کنن:قلب:

khokhan
سه شنبه 27 خرداد 1393, 21:39 عصر
سلام دوستان
من به تازگی شروع به یادگیری collection های سی شارپ کردم که اول از لیست شروع کردم و حالا رفتم سراغ لیست پیوندی. اما نمی دونم که لیست پیوندی چه مزیتی نسبت به list داره؟
اگر مثل هم هستن که دیگه نیازی نیست یاد بگیرم.
میخواستم بدونم لیست پیوندی چه مزیتی نسبت به list داره و آیا مواردی هست که فقط باید از لیست پیوندی استفاده کرد و collectionهای دیگه رو نشه بکار برد؟
البته همین سوالو هم در مورد dictionary و hashTable دارم.
ممنون میشم دوستانی که اطلاعاتی در این زمینه دارن منو راهنمایی کنن:قلب:

ژنريک ها چيز جديدي نيستند . آن ها شبيه الگوها در ++C هستند. همچنين مي توانيد ژنريک ها را در زبان هاي ديگر مانند Java بيابيد. ژنريک ها امکان ساخت يک کلکسيون عام و قوي را مي دهند. همچنين از آنجايي که در زمان اجرا روي مي دهند احتمال بروز خطاها کمتر است.
فضا نام System.Collections.Generic امکان دستيابي به نگارش هاي ژنريک کلاس هاي Stack - Dictionary - List - Queue را مي دهد.



Dictionary
يکي از کلکسيون هاي بسيار کاربردي مي باشد که امکانات نسبتا" خوبي را براي برنامه نويسان فراهم مي کند. Dictionary تقريبا" مانند يک آرايه دو بعدي عمل مي کند. در اين شيء بعد اول کليد (Key) و بعد دوم مقدار (Value) خوانده مي شود. به کمک کليد ها مي توان به مقادير دسترسي داشت. همچنين با کمک تکرار کننده مي توان تمام مقادير و کليد ها را خواند.
در واقع شيء Dictionary يک شيء کليد - مقدار (Key & Value) است .

جهت استفاده از شيء Dictionary ابتدا فضا نام System.Collections.Generic را به پروه خود اضافه کنيد :

using System.Collections.Generic;
براي تعريف و ايجاد شيء Dictionary مي توانيد از دستور زير استفاده کنتيد :

Dictionary < string, object > MyDic = new Dictionary < string, object >();
مقدار دهي به شيء Dictionary :

MyDic.Add("Name", "Alireza");
MyDic.Add("age", 23);
راي دسترسي به مقادير شيء Dictionary به دستورات زير توجه کنيد :

string member_name = MyDic["Name"];
int member_age = MyDic["age"];
اضافه کردن پارامتر با کليد هم نام امکان پذير نيست! دستورات زير ايجاد خطا مي کند.

MyDic.Add("Name", "Alireza");
MyDic.Add("Name", "Nima");
براي خواندن مقادير و کليد ها به کمک يک تکرار کننده مي توان از KeyValuePair و foreach استفاده کرد.

foreach (KeyValuePair<string, object> kvp in MyDic)
{
Response.Write(kvp.Key + " = " + kvp.Value.ToString() + "<br/>" );
}
یه نمونه مثال می زنم تا کاربرد dictionary بهتر روشن بشه :
فرض کنین پروسچری های مختلفی برای جداول مختلف توی بانک دارین و دوست دارین تنها با یه کلاس HElper کلیه جداول رو بدون کد های تکراری هنگام اینسرت اطلاعات مدیریت کنین :
در داخل کلاس Helper یه متد برای وارد نمودن اطلاعات به صورت عمومی به این شکل ایجاد می کنین :

public void InsertUpdate(string sp, string para,string action, Dictionary<string, object> paramse)
{



using (SqlConnection con = new SqlConnection(strConnString))
{
con.Open();
int id = 0;
SqlCommand cmd = new SqlCommand(sp, con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@id", (object)id ?? DBNull.Value);
cmd.Parameters.AddWithValue(para, action).ToString();

foreach (string key in paramse.Keys)
{
cmd.Parameters.AddWithValue(key, paramse[key]);
}

cmd.ExecuteNonQuery();
con.Close();

}

//return rows;
}
با وجود این متد در هر کدوم از فرمها و برای هر کدوم از جداول بانک می تونین با ایجاد تنها یک لیست از نوع dictionary و بدون تکرار پارامترها به تک تک اونها دستیابی داشته باشین :


Dictionary<string, object> paramse = new Dictionary<string, object>();
paramse.Add("@u_name", textBox1.Text);
paramse.Add("@u_lname", textBox2.Text);
paramse.Add("@u_tell", textBox3.Text);
paramse.Add("@Adress", textBox4.Text);

hlp.InsertUpdate("user", "@Actien", "Insert", paramse);

شاید بشه کارهای زیادی مانند این مورد انجام داد اما به این زیبایی نمی شه:لبخند:

منبع http://msdn.microsoft.com/en-us/library/xfhwa508%28v=vs.110%29.aspx

elec60
سه شنبه 27 خرداد 1393, 21:47 عصر
سلام دوستان
من به تازگی شروع به یادگیری collection های سی شارپ کردم که اول از لیست شروع کردم و حالا رفتم سراغ لیست پیوندی. اما نمی دونم که لیست پیوندی چه مزیتی نسبت به list داره؟
اگر مثل هم هستن که دیگه نیازی نیست یاد بگیرم.
میخواستم بدونم لیست پیوندی چه مزیتی نسبت به list داره و آیا مواردی هست که فقط باید از لیست پیوندی استفاده کرد و collectionهای دیگه رو نشه بکار برد؟
البته همین سوالو هم در مورد dictionary و hashTable دارم.
ممنون میشم دوستانی که اطلاعاتی در این زمینه دارن منو راهنمایی کنن:قلب:


کلاس زير رو در نظر بگیر:



class Temp
{
public decimal A, B, C, D;

public Temp(decimal a, decimal b, decimal c, decimal d)
{
A = a; B = b; C = c; D = d;
}
}


کد زیر زمان اجراش تقریبا دو برابر کد بعدیشه:

LinkedList<Temp> list = new LinkedList<Temp>();

for (var i = 0; i < 12345678; i++)
{
var a = new Temp(i, i, i, i);
list.AddLast(a);
}

decimal sum = 0;
foreach (var item in list)
sum += item.A




List<Temp> list = new List<Temp>(); // 2.4 seconds

for (var i = 0; i < 12345678; i++)
{
var a = new Temp(i, i, i, i);
list.Add(a);
}

decimal sum = 0;
foreach (var item in list)
sum += item.A;

به طور کلی List از LinkedList سریعتره.


اگر بخواییم وسط لیست پیوندی عضوی اضافه کنیم باید تا وسطش تو حلقه بریم جلو و node مورد نظر رو پیدا کنیم و بعد insert کنیم که خیلی کندتر از Insert تو List هست. چون تو List با اندیس میشه به عناصر دسترسی پیدا کرد ولی تو LinkedList پیمایش لازمه


در کل اگه Random Access مد نظر باشه List بهتره و LinkedList رو نمیشه با اندیس به عناصرش دسترسی پیدا کرد.
اگه بحث Insert و Remove مطرح باشه قسمت Insert کردن هزینه کمی تو LinkedList داره چون فقط نیاز به چند تا تغییر آدرس داره ولی تو List کل خونه های بعد از Inserted Item باید Update بشن و بجاش پیدا کردن جایی که میخواییم Insert کنیم سریعتره...