سؤال
لديّ قطعة رمز في C#:
private static void _constructRow(SqlDataReader reader, system.IO.StreamWriter stwr, bool getColumnName)
{
for (int i = 0; i < reader.FieldCount; i++)
stwr.Writeline(String.Format("<td>{0}</td"), getColumnName ? reader.GetName(i) : reader.GetValue(i).ToString()));
}
أحاول أن أفهم ما هو الجزء الذي يبدأ بـ "getColumnName؟" وينتهي بـ ".ToString ()". لقد فهمت أنه نظام. نوع الكائن ، لكن ليس لدي أي فكرة عما يفعله على وجه التحديد أو كيف يعمل. أريد ذلك بسبب هذا: كان "القارئ" صفوفًا متعددة فيه ، وأريد أن أكتب صفوفًا محددة فقط.
إذا كان بإمكان أي شخص مساعدتي في أي من هؤلاء ، سأكون ممتنًا.
المحلول
تكرر الوظيفة على جميع الأعمدة في قارئ البيانات ، ثم لكل واحدة:
لو getColumnName
إرجاع صحيح ، فإنه يخرج اسم العمود بين <td>
العلامات ، وإلا قيمة البيانات.
لمزيد من البناء:
reader.GetName(i) - this returns the name of the column
reader.GetValue(i).ToString() - this returns the value of the column as a string
getColumnName - a function the will return true if a column name can be gotten
?: - the conditional operator. If the expression before the ? is true, the expression to the left of the : is used, otherwise the one on the right
String.Format("<td>{0}</td", arg) - this will output "<td>arg</td>" (btw - your code is wrong, the ) should not be just after the first string)
نصائح أخرى
هذا ال المشغل الشرطي. يقول إذا getColumnName
صحيح ، ثم الاستخدام reader.GetName(i)
خلاف ذلك استخدام reader.GetValue(i).ToString()
التنسيق هو:
ThingToCheck ? UseIfCheckIsTrue : UseIfCheckIsFalse
في الكود ، يبدو الأمر getColumnName
هو حقيقي بالنسبة إلى صف الرأس ، لذلك يتم إخراج اسم العمود مرة أخرى لجميع الصفوف الأخرى باستخدام خاطئة, ، لإخراج القيم.
وهذا ما يسمى المشغل الشرطي.
الحجة getColumnName
يتم تقييمه وإذا كان صحيحًا ، فإن الحجة الأولى بعد ?
عاد ، إذا كان خطأ ، والثاني.
لذا ، إذا كان getColumnName == صحيح ، فسترى <td>NAME</td>
آخر <td>Value</td>
منطقي؟
إنه مثل المتابعة
if (getColumnName == true)
{
reader.GetName(i); // GetName is string so no need to convert this in string I.E ToString()
}
else
{
reader.GetValue(i).ToString(); // GetValue returns object so this needs to convert in string using .ToString()
}
لأن getColumnName من نوع منطقي ، لذا لا حاجة لاختباره مثل
If (getColumnName == true)
يمكنك كتابة هذا على أنه
If (getColumnName)
String.Format (سلسلة ، طريقة)
و string.Format Method يستبدل العناصر الموجودة في السلسلة المحددة مع كائن معين ، تحتوي هذه الطريقة على وسيطين أولاً على سلسلة والثانية كائن. علي سبيل المثال
string.Format("Question number {0} is answered by {1} {2}", 11, "Adam", "Yesterday");
سيكون وضع خارج
تم الإجابة على السؤال 11 من قبل آدم أمس
كما ترون {0} يتم استبداله بـ 11 ويتم استبدال {1} بـ Adam و {2} يتم استبداله بالأمس.
يمكنك قراءة المزيد عن هذا هنا
هذا هو عامل ثلاثي, ، تستخدم لدستور adhoc من IF كتلة أخرى.