Range
中提取一个值,并验证这些单元格的值在此范围内是否相同; 这是一段代码:
internal object GetValueFromCells(string start, string end, Formats format) {
// Verifying for empty or null parameters here and throwing accordingly...
try {
Range cells = Excel.get_Range(start, end) as Range;
object value = null;
bool sameValue = false;
foreach(Range cell in cells) {
// This condition block shall execute only once, since 'value' shall not be null afterwards.
if (value == null || value == DBNull.Value)
if (Formats.Formated == format) {
value = cell.Text;
// The following results to be false !?...
sameValue = value == cell.Text; // Shall this not be true?
} else {
value = cell.Value2;
// The following results to be false !?...
sameValue = value == cell.Value2; // Shall this not be true?
}
// This results being always false!?...
// Shall this not be true, I wonder?
sameValue = Formats.Formated == format ? value == cell.Text : value == cell.Value2;
if(!sameValue)
return null;
}
return value;
} catch (Exception ex) {
// Exception handling...
}
}
读取这段代码时,我会谦卑地期望当范围内的所有单元格具有相同的值(例如334)时返回一个值。
但是,此方法始终返回null(在Visual Basic中为Nothing)!
任何人都可以解释我在这里失踪的内容:
value == cell.Value2
总是返回 false ?
也许我的算法不太正确?
编辑#1
这解决了这个问题:
sameValue = Formats.Formatted == format ? cell.Text.Equals(value) : cell.Value2.Equals(value);
我接受了@Jerod Houghtelling的回答,因为他的回答表明了解决问题的ToString()和Equals()方法。
除此之外,我不喜欢调用ToString()方法,因为值可以是数字,比较字符串下的数字对我来说很奇怪。所以我更喜欢我在解决方案中采用的Equals()方法。
我要感谢@Sir Gallahad和@Jerod Houghtelling的好答案。这是我第一次面对这样的情况,他们都帮助我更好地了解幕后发生的事情,以及其他通过评论做出贡献的人。
感谢那些赞成我问题的人。这有助于证明我不是那么愚蠢的要求! = P呵呵呵......
答案 0 :(得分:3)
value == cell.Value2
可能正在比较来自不同实例的对象。
尝试value.ToString() == cell.Value2.ToString()
答案 1 :(得分:3)
我猜测cell.Value2
每次调用它时都会返回一个对象的新实例。因此,我推断==
正在检查以查看等式的两边是否是对象的同一个实例。要实际比较双方存储的值,您必须使用.Equals
或将值转换为可比较的值,例如字符串。
sameValue = value.Equals( cell.Value2 );
/* or */
sameValue = value.ToString() == cell.Value2.ToString();
我也没有在你的例子中看到 value
被设置。