PDA

View Full Version : سوال: لیست 2 بعدی



f_g1348
یک شنبه 25 تیر 1391, 14:04 عصر
با سلام
می دونم برای تعریف لیست از کد زیر استفاده می کنند ولی آیا می توان لیست 2 بعدی هم تعریف کرد ؟

List<int> list = new List<int>();
list.Add(2);
list.Add(3);
list.Add(5);
list.Add(7);

fjm11100
یک شنبه 25 تیر 1391, 14:17 عصر
برای حالت تو در تو میتونی از

List<List<int>> nest = new List<List<int>>();

استفاده کنی اما اگر منظورت چیزی مثل Key, Value است از Dictionary استفاده کن

Dictionary<int, string> dic = new Dictionary<int, string>();

f_g1348
یک شنبه 01 مرداد 1391, 11:10 صبح
دووست عزیز در حقیقت من می خواهم یک آرایه دو بعدی در سیستم تعریف کنم که :
اولا در سراسر سیستم قابل استفاده باشد
ثانیا در ابتدا ابعادش معلوم نیست و در حین اجرا مشخص می شود
در اصل برنامه من به این صورت کار می کند که یک سری جمله از ورودی گرفته و کلمات را در هر جمله می شمارد و یک ماتریس ( آرایه دوبعدی ) خروجی م یدهد که سطرها معرف جملات و ستون ها معرف کلمات هستند

tooraj_azizi_1035
یک شنبه 01 مرداد 1391, 11:25 صبح
سلام
دوست من شما باید ابتدا با استفاده از متد strring.Split('.') که نقطه رو معیار اتمام جمله قرار می ده متن ورودی رو به چندین جمله تفکیک کنی. که این کار یه آرایه از جملات رو بهت میده بعد هر خونه از آرایه چون خودش رشته هست می تونه دوباره split(' ') بشه تا بتونی جمله رو به چندین کلمه خرد کنی. نیازی به دونستن از قبل طول آرایه نیست.

Saeed_m_Farid
یک شنبه 01 مرداد 1391, 12:20 عصر
دووست عزیز در حقیقت من می خواهم یک آرایه دو بعدی در سیستم تعریف کنم که :
اولا در سراسر سیستم قابل استفاده باشد
ثانیا در ابتدا ابعادش معلوم نیست و در حین اجرا مشخص می شود
در اصل برنامه من به این صورت کار می کند که یک سری جمله از ورودی گرفته و کلمات را در هر جمله می شمارد و یک ماتریس ( آرایه دوبعدی ) خروجی م یدهد که سطرها معرف جملات و ستون ها معرف کلمات هستند
موردی که fjm11100 (http://barnamenevis.org/member.php?67728-fjm11100) در 2# (http://barnamenevis.org/showthread.php?351177-%D9%84%DB%8C%D8%B3%D8%AA-2-%D8%A8%D8%B9%D8%AF%DB%8C&p=1548885&viewfull=1#post1548885) اشاره کردن، کاملاً این نیاز شما رو پوشش میده؛ شما کافیه یک Dictionary بصورت public static در کلاس اصلی پروژه تعریف کنید که اولین عضوش "معرف جملات" و دومین عضوش هم یک لیست "معرف کلمات" باشه، برای نمونه:
public static Dictionary<string, List<string>> global_terms =
new Dictionary<string, List<string>>();

private void test()
{
List<string> terms = new List<string>
{
"الا يا ايها الساقی ادر کاسا و ناولها",
"که عشق آسان نمود اول ولی افتاد مشکل‌ها",
"به بوی نافه‌ای کاخر صبا زان طره بگشايد",
"ز تاب جعد مشکينش چه خون افتاد در دل‌ها",
"مرا در منزل جانان چه امن عيش چون هر دم",
"جرس فرياد می‌دارد که بربنديد محمل‌ها",
"به می سجاده رنگين کن گرت پير مغان گويد",
"که سالک بی‌خبر نبود ز راه و رسم منزل‌ها",
"شب تاريک و بيم موج و گردابی چنين هايل",
"کجا دانند حال ما سبکباران ساحل‌ها",
"همه کارم ز خود کامی به بدنامی کشيد آخر",
"نهان کی ماند آن رازی کز او سازند محفل‌ها",
"حضوری گر همی‌خواهی از او غايب مشو حافظ",
"متی ما تلق من تهوی دع الدنيا و اهملها"
};
foreach (string item in terms)
global_terms.Add(item, item.Split(' ').ToList());

Console.WriteLine(global_terms);
}

مشخصاً شما بجای اون لیست terms، می‌تونید از ورودی، جملات خودتون رو بگیرید...

f_g1348
یک شنبه 01 مرداد 1391, 14:40 عصر
من اصلاً متوجه نشدم دقيقاً چي شد !!!
اينو مي دونم كه يك آرايه دارم ( از ورودي گرفتم ) كه يكسري كلمات داخلش هست و يك متن كه اون هم از ورودي گرفتم حالا مي خواهم تعداد تكرار هر كلمه را درون هر جمله ببينم چنتاست ؟
يعني تو c# آرايه دو بعدي وجود نداره كه بشه بصورت سراسري تعريف كرد و طولش را بعداً مشخص كرد ؟

Saeed_m_Farid
یک شنبه 01 مرداد 1391, 16:02 عصر
...يعني تو c# آرايه دو بعدي وجود نداره كه بشه بصورت سراسري تعريف كرد و طولش را بعداً مشخص كرد ؟
نه، اگه منظورتون چیزی مثل memset یا malloc برای مثلاً [] *char که تو ++C/C داشتیم باشه، نه اینجا نداریم؛ تو #C همه چیز مدیریت شده است و اگه برنامه‌نویس native هستید و تازه اومدین تو دات نت باید به راه‌های دیگه‌ای عادت کنید که من تو کد و توضیحات پست قبلی توضیح دادم.
به عنوان نمونه، تو دات نت بجای اون‌ها از لیست‌های جنریک استفاده میشه ...
اگه مشتاق تفاوت‌های تعریف و معماری متغیرها و ... تو دات‌نت باشید، قبلاً در موردشون اینجا (http://barnamenevis.org/showthread.php?351079) صحبت کردیم.

f_g1348
دوشنبه 02 مرداد 1391, 08:43 صبح
خوب دوست عزيز اگر ميشه كد قبلتون رو يكم واضحتر توضيح بدهيد ( من تازه شروع به كار با c# كردم )
مثلاً term در اينجا متن ورودي ما است كه شامل چندين جمله مي باشد كه با نقطه از هم جدا شدند ؟
پس كلمات كجا هستند كه بايد آنها را در متن پيدا كرده و شمارش كنيم ؟

Saeed_m_Farid
دوشنبه 02 مرداد 1391, 09:53 صبح
"term در اينجا متن ورودي ما" نیست؛ terms (=جملات) همونطورکه از نامش پیداست، یک آرایه از جملات هست که با فرض اینکه شما می‌دونید List چی هست -پست اول خودتون- نوشتم، اگه یه متن طولانی دارید که جملات‌اش با نقطه از هم جدا شده، همونطورکه tooraj_azizi_1035 (http://barnamenevis.org/member.php?41757-tooraj_azizi_1035) اشاره کردن، با split کردنش می‌تونید به همین terms برسید؛ تو این مثال فرض شده اینکار قبلاً با یک خط کد انجام شده.
بقیه رو هم که اشاره کردم، تمام جملات و کلمات split شده درون همون "Dictionary که بصورت public static در کلاس اصلی پروژه تعریف" شده، قرار می‌گیرن، عضو اول میشه جمله شما و عضو دوم کلمات تفکیک شده اون جمله با delimiter فاصله (space)؛ دیگه نمی‌دونم چطور توضیح بدم، اگه بخواین اون جمله رو هم با نقطه split کنید میشه اینطوری (واسه هر خط هم کامنت گذاشتم):
string entry = "your entry. balh blah blah. blah1 blah1 blah1 . blah2 blah2. blah blah blah.....";

//Split entry tor term(s) with '.' delimiter
foreach (string term in entry.Split('.'))
// Check term doesn't empty
if (term.Trim().Length > 0)
// check term not exist before!
if (!global_terms.ContainsKey(term.Trim()))
//Split term to word(s) and fill
//Global dictionary's second member with word(s)
global_terms.Add(term.Trim(), term.Trim().Split(' ').ToList());

f_g1348
دوشنبه 02 مرداد 1391, 11:27 صبح
"term در اينجا متن ورودي ما" نیست؛ terms (=جملات) همونطورکه از نامش پیداست، یک آرایه از جملات هست که با فرض اینکه شما می‌دونید List چی هست -پست اول خودتون- نوشتم، اگه یه متن طولانی دارید که جملات‌اش با نقطه از هم جدا شده، همونطورکه tooraj_azizi_1035 (http://barnamenevis.org/member.php?41757-tooraj_azizi_1035) اشاره کردن، با split کردنش می‌تونید به همین terms برسید؛ تو این مثال فرض شده اینکار قبلاً با یک خط کد انجام شده.
بقیه رو هم که اشاره کردم، تمام جملات و کلمات split شده درون همون "Dictionary که بصورت public static در کلاس اصلی پروژه تعریف" شده، قرار می‌گیرن، عضو اول میشه جمله شما و عضو دوم کلمات تفکیک شده اون جمله با delimiter فاصله (space)؛ دیگه نمی‌دونم چطور توضیح بدم، اگه بخواین اون جمله رو هم با نقطه split کنید میشه اینطوری (واسه هر خط هم کامنت گذاشتم):
string entry = "your entry. balh blah blah. blah1 blah1 blah1 . blah2 blah2. blah blah blah.....";

//Split entry tor term(s) with '.' delimiter
foreach (string term in entry.Split('.'))
// Check term doesn't empty
if (term.Trim().Length > 0)
// check term not exist before!
if (!global_terms.ContainsKey(term.Trim()))
//Split term to word(s) and fill
//Global dictionary's second member with word(s)
global_terms.Add(term.Trim(), term.Trim().Split(' ').ToList());


دوست عزیز قبل از هر چیز لازمه که ازت تشکر کنم بخاطر محبتی که داری و راهنمایی می کنی ولی این کدی که شما دارین به این صورت کار می کنه که تا نقطه تمام کلمات را می شمارد ( مثلاً اگر جمله " من من تو " باشد خروجی 3 دارد ) ولی من دقیقا می خواهم به من بگه 2 بار کلمه من و 1 بار کلمه تو آمده
در مثال زیر واضح تر می گم :
" من من تو . من تو . "
در جمله اول کلمه من 2 بار و کلمه تو 1 بار
در جمله دوم کلمه من 1 بار و کلمه تو 1 بار وجود دارد
ممنون میشم اگر بازهم من را راهنمایی بفرمایید

Saeed_m_Farid
دوشنبه 02 مرداد 1391, 13:38 عصر
این کد چیزی رو نمی‌شماره! صورت سوال شما یه چیز دیگه بود:
...در حقیقت من می خواهم یک آرایه دو بعدی در سیستم تعریف کنم که :
اولا در سراسر سیستم قابل استفاده باشد
ثانیا در ابتدا ابعادش معلوم نیست و در حین اجرا مشخص می شود ...
شمردن کلمات تکراری، کار اول ابتدایی هست؛ من لیست کلمات رو تهیه کردم، برای چیزی که می‌خواین، اگه linq نمی‌خواین بنوبسین، یه for بذارین، برای هر لیست count بگیره ...
چون احساس می‌کنم مشکل اصلی شما رفع شده، ادامه نمیدم!
موفق باشید./

f_g1348
دوشنبه 02 مرداد 1391, 14:33 عصر
دوست عزيز از نحو خطاب كردنتون ممنون ( کار اول ابتدایی هست )
من در پست هاي ديگر هم اين سوال را به نحوي مطرح كردم و گفتم كه من اين برنامه را بصورت تمام و كمال در vb.net نوشتم و حالا مي خواهم در c# پياده سازي كنم و نيز c# هم ياد بگيرم
در توضيحات نيز اين را بگويم كه من كلمات يكتا را در جمله پيدا مي كنم و نيز با ريختن كل متن درون يك آرايه بصورت كلمه به كلمه ، درون آن را براي كلمات جستجو كرده و تعداد تكرار كلمات را پيدا مي كنم ( به اين دليل از اين روش استفاده مي كنم چون برنامه يك ورودي داره كه اين قابليت را به كاربر مي ده تا با دادن عددي ، تعداد جملات را با هم ادغام كند )
ولي مشكل من اينجا بود كه وقتي كلمات را مي شمارم مي خواهم بگويم در فلان جمله ، فلان كلمه اين تعداد تكرار شده تا در جاهاي ديگر برنامه ( محاسبات كسينوسي ) از اين اعداد استفاده كنم و چيزي كه به ذهن من رسيد استفاده از آرايه دو بعدي بود ( كه در vb.net به راحتي پياده شد ) كه در ابتدا ابعادش معلوم نيست و با خواندن متن از ورودي اين ابعاد مشخص ميشه
من هنوز سوالم پا برجاست كه چطور اين كار ( با اين توصيف ) را انجام دهم ( تعريف آرايه دو بعدي )