【问题标题】:Equality comparer `FindIndex` vs `IndexOf`平等比较器`FindIndex`与`IndexOf`
【发布时间】:2016-07-05 17:31:29
【问题描述】:

我有这行代码:

int MyIndex = MyListOfCustomObjects.IndexOf(CandidateObject); 
// assume CandidateObject exists in the list

现在我知道List.FindIndex Method

搜索与 a 定义的条件匹配的元素 指定谓词,并返回第一个从零开始的索引 出现在列表或其一部分中。

我想知道,某个类的所有对象都具有相同的大小吗?

如果是,并且由于没有使用IndexOf指定谓词,那么条件应该匹配以便在MyListOfCustomObjects 中找到CandidateObject

另外,“.. 或其中的一部分。”是什么意思?

【问题讨论】:

  • 你的问题有点混乱。您的标题提到了“平等比较器”,但没有提到问题的主体。同样,您询问 FindIndex,但您的示例代码使用 IndexOf。这是两种不同的方法...
  • 每个问题应该问一个问题,而不是几个问题。
  • @Mike 我在问IndexOf 的“平等比较器”。我的“示例代码”如何知道匹配的是哪个对象?
  • @Servy,也许我应该解决这个问题。谢谢
  • @FirstStep,那么我建议阅读 the documentation of IndexOf 而不是 FindIndex....

标签: c#


【解决方案1】:

那么应该匹配哪些条件才能在MyListOfCustomObjects 中找到CandidateObject

documentation 间接回答:

此方法使用默认相等比较器 EqualityComparer<T>.Default 确定相等比较器 T,列表中的值类型。

如果您点击EqualityComparer<T>.Default 的链接,您会发现它调用了为该类定义的通用Equals(T) 方法(如果存在)或非通用Equals(object) 重载。如果T 没有实现/覆盖任一方法,则默认使用reference相等,因为object.Equals(object) 就是这样定义的。

Scott 已回答您关于“..或其中一部分”的问题。完美,我不确定你所说的“相同大小”是什么意思,或者它与平等有什么关系。不能保证同一类的两个 对象 具有相同的内存占用,如果这就是您所要求的。

【讨论】:

    【解决方案2】:

    所有项目将只占用 1 个索引槽,因此您可以将它们视为“具有相同大小”。

    IndexOf 没有可以定义的谓词,但它仍然跟随一个。您可以将IndexOf 视为实现为

    public int IndexOf(T item)
    {
        return this.FindIndex(x => item.Equals(x));
    }
    public int IndexOf(T item, int startIndex)
    {
        return this.FindIndex(startIndex, x => item.Equals(x));
    }
    public int IndexOf(T item, int startIndex,int count)
    {
        return this.FindIndex(startIndex, count, x => item.Equals(x));
    }
    

    “或它的一部分”部分适用于当您使用接收startIndex 的重载时,这允许您从提供的索引而不是从 0 开始在列表的中途开始搜索。对于例如,如果您想找到第二个项目,您将找到第一个项目的索引,然后在结果 + 1 上再次调用 find 以找到第二个索引。

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 1970-01-01
      • 2019-12-12
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多