آرشیو برای آوریل, 2008

تبديل انواع آرايه ها به هم

مثل اينكه قرار هستش اينجا از مشكلات برنامه نويسيم صحبت كنم . يكي از اين مشكلات را كه اينجا مي خواهم بگم مربوط مي شه به عنوان اين مطلب.
يك مجموعه از اعداد كه به صورت رشته و با يك علامت مانند كاما از هم جدا شده اند را مي خواهيم در يك آرايه از نوع int ذخيره كنيم:
فرض كنيم اين رشته هم به صورت زير است:
stringInt = “1,2,3,5,6″;
حالا مي خواهيم اين اعداد را داخل يك آرايه عددي قرار بدهيم. اولين روش به صورت زير خواهد بود :

// birinci kod
string[] strArray = stringInt.Split(‘,’);
int[] intArray = new int[strArray.Length];

for (int i = 0; i < strArray.Length; i++)
{
intArray[i] = int.Parse(strArray[i]);
}
با دستور Split رشته با توجه به مقدار پارامتر كه يك كاراكتر مي باشد به زير مجموعه تبديل مي شود. بعدشم كه ساده است. (كما اينكه اوليشم ساده بود.)
اما چطور مي شه اين كد 6 و به عبارتي 4 خطي را در .NET مختصرتر نوشت. اولين حوابي كه من به اون برخورد كردم استفاده از Array.ConvertAll بود. فرمت كلي اين دستور به صورت زير است:
// ikinci kod
Array.ConvertAll(MainArray, delegate(){});
كه براي stringInt به صورت زير خواهد بود :
intArray = Array.ConvertAll(strArray, delegate(string s) { return int.Parse(s); });
مي بينيد كه با يك دستور اين مورد به راحتي حل مي شود. حال اگر بخواهيم intArray را به يك نوع hex تبديل كنيم چه كار بايد بكنيم.:

با دو روش بالا به راحتي مي شه اين مسئله را حل كرد. من با روش دوم (ikinci kod) مي نويسم :
// ucunci kod
string[] hexArray = Array.ConvertAll(intArray , delegate (int n) { return n.ToString(“X”); });
اما مي توانيد كد سوم را مختصر تر نيز بنويسد. با توجه به اينكه ويژوال بيسيك متد Hex دارد مي توانيد اين كار را به راحتي انجام دهيد:
string[] hexArray = Array.ConvertAll(intArray, Microsoft.VisualBasic.Hex);
اگر بخواهيد از اين حيله استفاده كنيد بايستي Microsoft.VisualBasic.dll را به referenceهاي پروژتان اضافه كنيد.
اگر .NET را بگرديد چيزهاي جالب ديگري نيز مي توانيد پيدا كنيد، مثلا نمايش عناصر آرايه در پنجره كنسول تنها با يك كد:
// dordonci kod
Array.ForEach(hexArray, Console.WriteLine);
متدهاي ديگري شامل UCase ,LCase ,Ltrim ,rTrim ,Trim وجود دارند كه مي توانيد براي تبديل يك آرايه يا ليست از آنها استفاده كنيد.

یک نظر بنویسید

TABLE در تگ innerHTML مشكل

پيش بيني در مورد وب لاگ نويس درست از آب در اومد و من بعد از يك ماه تازه ياد نوشتن افتادم.

عارضم خدمتتون بنده مثلا برنامه نويسم. صبح روز زماني كه اين متن را مي نويسم با مشكلي كه در تيتر مشاهده مي كنيد برخوردم. هر چقدر تو e-book هاي دوزديم گشتم چيزي پيدا نكردم ؛ بهترين راهنمائي تو وب هم مودبانه خواسته بود كه يك خاك ديگه اي به سر كنم.

موضوعي كه باعث شد بنده از تارك اللاگي درآم از اين قرار بود كه تو كار با جناب Ajax سمت سرور مكرمه چندين رديف يا همان <tr> با كلي <td> توليد كردم و به سمت كلاينت ارسال كردم؛ ]اينجا دو مطلب رو بايد بگم : اول اينكه من قبلا با JSON اين فعل را صرف مي كردم دوم اينكه روش برنامه نويسي من لاپه لاپه[

مثلا :

اين رشته سمت سرور ايجاد شده :

string tableBody = “<tr><th>1</th><td>ممد</td></tr><tr><th>2</th><td>علي</td></tr>”;

اگه تا حالا خوب دقت كرده باشت فهميدين كه چرا كار من عجيب بوده؛ و اما بعد:

حالا با Ajax كه من از Ajax.Request فريم ورك Prototype براي اين هدف فيض مي برم اطلاعات رو دريافت مي كنيم . ببينيد :

new Ajax.Request(url, {

method: ‘get’,

onSuccess: function(transport) {

$(‘tblBody’).innerHTML = transport.responseText;

}

});

بايد بگم فاير فاكس به خوبي اين دستورو اجرا كرد:

منظورم اين دستور بود =< $(‘tblBody’).innerHTML = transport.responseText;

اما امان از اين ميكروسافت با صداي اونور آبي.

IE با يك error كه يادم نيست و حوصله تستشم نيست حالم و گرفت. رفتم سراغ innerText . اين يكي گفتنشم …

اما چرا نشد كه بشه :

واقعيتش innerHTML همينطوري بعدا به IE اضاف شده. علما ميگن كه قرار نبوده كه باشه. بقيه اكسپلورها ذاتا اينو به همراه دارند. در IE خصيصه innerHTML براي يك عدده از تگ ها كه ذيلاً مي توانيد مشاهده كنيد readonly هستش. يعني اينكه $(‘tblBody’).innerHTML هر چي داخل $(‘tblBody’) باشه رو لو مي ده اما نمي زاره توش چيزي بريزي. مقدارشو تغغير بدي . {عمراً سعي نكن نمي شه. }

ليستي كه بالا گفتم ذيلا مي بينيد اينه:

COL, COLGROUP,FRAMESET, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD,TITLE,TR

خوب ديدين كه TABLE, TBODY,TRجزو ليست سياه IE هستش.

راستي تگ table سمت كلاينت شبيه چيزي كه زير مي بينيد بودش:

<table>

<caption>مثلا يه چيزي</caption>

<thead>

<tr>

<th>رديف</th>

<th>اسم</th>

</tr>

</thead>

<tbody id=’tblBody’></tbody>

</table>

اگه نتونيم از InnerHTML استفاده كنيم يه كار ديگه بايد بكنيم. مثلا بجاي tbody موجود در جدول يه tbody جديد بذاريم . قبلي رو برداريم جديده رو بذاريم.اينطوري :

$(‘tblBody’).replace(“<tbody id=’tblBody’>”+ transport.responseText +“</tbody>”);

امتحان نكردم بدون Prototype چطور مي شه اين كاو كرد . ولي ميشه .

راستي شايد اينم جواب بده؛ شايد:

$(‘tblBody’).update(transport.responseText);

به نظرم با اون innerText هم بشه ها البته با دستور replace جاوااسكريت. بعده اين كه innerText ريختين innerHTML رو نگاه كنين؛ جالبه نه.

یک نظر بنویسید