IndexOf无法找到List中的最后一个元素

时间:2014-06-10 13:59:21

标签: c# indexof

为什么IndexOf无法在List中找到此代码中的最后一个元素?

  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已经过排序。

2 个答案:

答案 0 :(得分: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);
}

答案 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));
}