2014-06-10 74 views
2

为什么IndexOf无法找到List中的最后一个元素?IndexOf找不到列表中的最后一个元素

public List<Rule> rules = new List<Rule>(); 
    Rule n = new Rule(); 
    rules.Add(n); 
    Console.WriteLine(n == rules.Last<Rule>()); //True 
    dg_main.SelectedIndex = rules.IndexOf(n); //-1 

答: 谢谢大家的时间。 我对这种情况感到困惑,甚至没有看到它不是IndexOf的错。 这是更改索引的dg_main.SelectedIndex。 DataGrid已排序。

+7

的IndexOf使用EqualityComparer(然后最后的Object.Equals()或重写默认实现)。 ==运算符可能会有所不同。 Rule类的代码是什么? –

+1

你能突出显示哪些代码可以一起运行吗?我知道你最初发布的第一行和其他行之间有一个空格,既然你不能有一个公共的局部变量,那你可能试图指出第1行在一个地方,其余行在其他地方?一个简短但完整的例子,我们可以复制并粘贴到(比如说)控制台项目中会很有帮助。 –

回答

0

我觉得你有代码,您没有表现出犯的一个错误,因为下面的代码工作正确的:

[Test, Explicit] 
public void Test() 
{ 
    List<Rule> rules = new List<Rule>(); 
    Rule n = new Rule(); 
    rules.Add(n); 
    Assert.AreEqual(n , rules.Last()); 
    Assert.AreEqual(0, rules.IndexOf(n)); 
} 
2

IndexOf,如图所示here,使用EqualityComparer的.Equals方法,该方法使用EqualityComparer.Default,从而产生this比较器。正如你所看到的,它使用.Equals方法,而不是等号运算符。

这样做的一个主要原因是与所有运算符一样,相等运算符是静态的,因此不会正确调用所需的运算符,除非编译器在编译时具有正确的类型。

最简单的解决方法是实现.Equals并使其调用相等比较器。

// Equals overload for Rule objects 
public bool override Equals(object obj) 
{ 
    if(obj is Rule) 
     return (Rule)obj == this; // Type cast here to ensure the right equality operator is called 
    else return base.Equals(obj); 
} 
相关问题