سؤال

أحاول المقارنة بين اثنين DataRowفي حلقة.ومع ذلك، ما يلي if البيان لا يعود true:

if (dt1.Rows[0]["Name"] == dt2.Rows[b]["Name"]) {
    // This never executes
}

ومع ذلك، إذا قمت بإضافة .ToString() إلى نهاية كل منهما DataRow, ، ال if يعود البيان true:

if (dt1.Rows[0]["Name"].ToString() == dt2.Rows[b]["Name"].ToString()) {
    // This now executes
}

العمود "الاسم" من نفس الجدول/العمود.إذن السؤال بسيط للغاية..ما الخطأ الذي افعله؟

شكرًا
ستيفن

هل كانت مفيدة؟

المحلول

itsmatt وقال أو قصاصة الأول الخاص بك هو القيام المقارنة المرجعية. بديل للدعوة ToString هو استخدام Object.Equals:

if (Object.Equals(dt1.Rows[0]["Name"], dt2.Rows[b]["Name"])) {
    // stuff
}

والسبب لاستخدام أسلوب ثابت بدلا من أسلوب مثيل لتجنب المشاكل مع إشارات فارغة.

نصائح أخرى

تحتوي هذه الخلايا على كائنات، لذا فأنت تقوم بمقارنة الكائنات، والتي تقوم فقط بإجراء مقارنة مرجعية، والتي تختلف عن مقارنة القيم.إنه يطرح السؤال "هل هذان الكائنان هما نفس الكائن حقًا؟"، هل يشيران بشكل أساسي إلى نفس الكائن، ومن ثم "المقارنة المرجعية".عند إجراء استدعاء ToString()، فإنك تقوم بعد ذلك بمقارنة السلسلة.وهذا هو السبب في أنه يعمل.

فيما يلي رابط لمناقشة MS حول Operator== والمقارنة.

والمشغل ==، إن لم يكن فوق طاقتها، غير مطابقة لReferenceEquals() - أي أنه يحدد ما إذا كان اثنان نظرا objects هي نفس الحالات

.

والدعوة إلى ToString() بإرجاع كائن من الدرجة string، الذي مثقلة مشغل ==، والتي لا مقارنة السلسلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top