PDA

View Full Version : سوال: مقداردهي arraylist يا linkedlist يا list



programmer2
سه شنبه 02 مهر 1387, 15:07 عصر
من يك آرايه كلاس دارم كه توي هركدوم از ليستهاي بالا ميذارم هميشه اخري توي همه خونه هاش ثبت ميشه ؟؟؟؟؟!!!!! (يعني هر object جديدي از كلاس ميخوام وارد آرايه بكنم توي تمام خونه هاي قبلش هم وارد ميشه.)

SMRAH1
سه شنبه 02 مهر 1387, 16:59 عصر
کد رو بگذار ،شاید اشتباه نوشتی

programmer2
چهارشنبه 03 مهر 1387, 09:17 صبح
کد رو بگذار ،شاید اشتباه نوشتی



ممنون، اينم كد :

class Class2

{
private static string _name="";
private static string _family="";
private static int _sh = 0;
public string name
{
get { return _name; }
set { _name = value; }
}
public string family
{
get { return _family; }
set { _family = value; }
}
public int shomare
{
get { return _sh; }
set { _sh = value; }
}
public override string ToString()
{
return _name + " " + _family ;
}
}



بالايي كلاسش بود ، اينم برنامه توي فرمم :



string[] a = new string[]{"Mina","Shima","Homa","Lida"};
string[] b = new string[]{ "Alavi", "Samadi", "Hasani", "Kamali" };
public ArrayList carr = new ArrayList();

كد زير توي يك دكمه است :

Class2 c = new Class2();
for (int i = 0; i < 4; i++)
{
c.name = a[i];
c.family = b[i];
c.shomare = 220 + i;
int h = carr.Add(c);
}

Mahdi.Kiani
چهارشنبه 03 مهر 1387, 11:04 صبح
1)برادر از این به بعد لطف کن و کد هات را درون تگ کد قرار بده تا برای دوستان خوانا تر باشه.
به این شکل




class
Class2

{
privatestaticstring _name="";
privatestaticstring _family="";
privatestaticint _sh = 0;
publicstring name
{
get { return _name; }
set { _name = value; }
}
publicstring family
{
get { return _family; }
set { _family = value; }
}
publicint shomare
{
get { return _sh; }
set { _sh = value; }
}
publicoverridestring ToString()
{
return _name + " " + _family ;
}
}


بالايي كلاسش بود ، اينم برنامه توي فرمم :



string[] a = newstring[]{"Mina","Shima","Homa","Lida"};
string[] b = newstring[]{ "Alavi", "Samadi", "Hasani", "Kamali" };
publicArrayList carr = newArrayList();




كد زير توي يك دكمه است :


Class2 c = newClass2();
for (int i = 0; i < 4; i++)
{
c.name = a[i];
c.family = b[i];
c.shomare = 220 + i;
int h = carr.Add(c);
}



******************************************

2)به جای ArrayList از GenericList استفاده کن ( برای دلیل به دنبال مفاهیم Box و Unbox و معایب آن و ... باش)
3) کد دکمه شما فقط یک آبجکت ایجاد می کند نه چهار آبجکت. برای همین فکر می کنی که 4 تا آبجکت مختلف هستند با مقادیر یکسان. در صورتی که یک آبجت می باشد که در پایان حلقه، مقدار نهایی ( به ازای i=3 درون آبجکت قرار می گیرد.
کد صحیح شده آن



Class2 c =null;
for (int i = 0; i < 4; i++)
{
c =new Class2();
c.name = a[i];
c.family = b[i];
c.shomare = 220 + i;
int h = carr.Add(c);
}

arezoo_sh
چهارشنبه 03 مهر 1387, 11:05 صبح
كسي ميتونه اين مشكل و حل كنه ؟؟ منم همين مشكل و دارم.

Mahdi.Kiani
چهارشنبه 03 مهر 1387, 11:19 صبح
سلام
شما کد بالایی را که دادم تست کردید و جواب نگرفتید؟

arezoo_sh
چهارشنبه 03 مهر 1387, 13:36 عصر
تویه کلاسی که من تو برنامم دارم تعداد property ها زیادن . راهی جز این نیست که arraylist همه رو باهم دریافت کنه؟؟؟ و دیگه احتیاجی نباشه که تو حلقه for یکی یکی دریافت کنه!

Mahdi.Kiani
چهارشنبه 03 مهر 1387, 22:35 عصر
تویه کلاسی که من تو برنامم دارم تعداد property ها زیادن . راهی جز این نیست که arraylist همه رو باهم دریافت کنه؟؟؟ و دیگه احتیاجی نباشه که تو حلقه for یکی یکی دریافت کنه!
سلام
منظور شما از اینکه یک دفعه بگیره چیه؟ ممکنه با یک مثال بیشتر توضیح بدید؟
گرچه سوال شما در ارتباط با سوال اصلی این تاپیک نیست.. سوال این تاپیک این بود که چرا هر چهار آبجکت class2 ، دارای یک مقدار می باشند که جوابش را در پست قبلی دادم...
ولی در هر حال، منظور شما از اینکه یک دفعه بگیره چیه؟ ممکنه با یک مثال بیشتر توضیح بدید؟

arezoo_sh
جمعه 05 مهر 1387, 10:59 صبح
بار اول کهcarr.Add(c)انجام میشه درست add میشه ولی بار دوم که این عمل می خواد انجام بشه و c جدیدی رو به خونه شماره 2 arraylist اضافه کنه , علاوه بر خونه 2 به خونه 1 هم اضافه می کنه , به طور کلی تر تو هر خونه arraylist که بخوام وارد کنم تو خونه های ما قبلش هم همونا رو کپی می کنه !
با Ilist و linkedlist هم امتحان کردم همین مشکل و داشت!!!!!
تو برنامه من c.name = txtname.text , مثله بالا از آرایه دریافت نمی کنه.

Mahdi.Kiani
شنبه 06 مهر 1387, 08:06 صبح
بار اول کهcarr.Add(c)انجام میشه درست add میشه ولی بار دوم که این عمل می خواد انجام بشه و c جدیدی رو به خونه شماره 2 arraylist اضافه کنه , علاوه بر خونه 2 به خونه 1 هم اضافه می کنه , به طور کلی تر تو هر خونه arraylist که بخوام وارد کنم تو خونه های ما قبلش هم همونا رو کپی می کنه !
با Ilist و linkedlist هم امتحان کردم همین مشکل و داشت!!!!!
تو برنامه من c.name = txtname.text , مثله بالا از آرایه دریافت نمی کنه.

شما کدی که من در پست شماره 4 دادم را تست کردید؟


public class Test
{
private int num;

public int Num
{
get { return num; }
set { num = value; }
}

private string name;

public string Name
{
get { return name; }
set { name = value; }
}

public override string ToString()
{
return string.Format("Num = ' {0} ' and Name = ' {1} '", num, name);
}

}




نحوه استفاده:



private void btnTest_Click(object sender, EventArgs e)
{
System.Collections.ArrayList arl = new System.Collections.ArrayList();

Test test = null;
for (int i = 0; i < 4; i++)
{
test = new Test();
test.Num = i;
test.Name = String.Format("Name [ {0} ]", i);
arl.Add(test);
}

StringBuilder sb = new StringBuilder();
foreach (object var in arl)
{
sb.Append(var);
sb.Append("\n");
}
MessageBox.Show(sb.ToString());

}




trace برنامه : ( همانطور که می بینید، چهار آبجکت مختلف با مقادیر مختلف)



http://i33.tinypic.com/4lsj9g.jpg


سوال : آیا مقدار متغیر شما در طول حلقه تغییر می کند یا خیر؟ اگر تغییر نمی کند چگونه انتظار مقادیر متفاوت را دارید؟
پ و :
مجددا یاد آوری می کنم که از لیست های ژنریک استفاده کنید.(به جای ArrayList )

programmer2
شنبه 06 مهر 1387, 08:37 صبح
2)به جای ArrayList از GenericList استفاده کن ( برای دلیل به دنبال مفاهیم Box و Unbox و معایب آن و ... باش)
3) کد دکمه شما فقط یک آبجکت ایجاد می کند نه چهار آبجکت. برای همین فکر می کنی که 4 تا آبجکت مختلف هستند با مقادیر یکسان. در صورتی که یک آبجت می باشد که در پایان حلقه، مقدار نهایی ( به ازای i=3 درون آبجکت قرار می گیرد.
کد صحیح شده آن



Class2 c =null;
for (int i = 0; i < 4; i++)
{
c =new Class2();
c.name = a[i];
c.family = b[i];
c.shomare = 220 + i;
int h = carr.Add(c);
}
[/quote]


سلام ، خيلي ممنون كه وقت گذاشتيد و كمكم كرديد ، من دقيقا كد شما را نوشتم ولي همونطور كه يكي از دوستان هم در جواب گفته بود ،هنوز همون مشكل دارم ،يعني مقدار جديد در خونه هاي قبلي آرايه هم كپي ميشه !!!!:عصبانی++:

Mahdi.Kiani
شنبه 06 مهر 1387, 12:32 عصر
سلام
من در پست قبل حتی عکس trace برنامه را هم گذاشتم براتون!
نمونه برنامه یا کد کاملتون را بذارید ببینم. در غیر اینصورت کمکی نمی تونم بکنم.
موفق باشید

arezoo_sh
شنبه 06 مهر 1387, 15:51 عصر
مقدار در طول حلقه تغییر می کنه , اشکال برنامه رو پیدا کردم . به خاطر این بود که متغیر هایی که توی کلاس تعریف کرده بودم public static بود . در صورتیکه همه متغیر ها فقط public تعریف بشن arraylist هم دیگه مشکلی نداره.
بازم ممنون از راهنمایینتون...

Mahdi.Kiani
شنبه 06 مهر 1387, 15:58 عصر
مقدار در طول حلقه تغییر می کنه , اشکال برنامه رو پیدا کردم . به خاطر این بود که متغیر هایی که توی کلاس تعریف کرده بودم public static بود . در صورتیکه همه متغیر ها فقط public تعریف بشن arraylist هم دیگه مشکلی نداره.
بازم ممنون از راهنمایینتون...

ببخشید بعد میشه بگید که چگونه توسط آبجکتی که با دستور new ایجاد کردید به اعضای static دسترسی پیدا کردید؟