List.IndexOf 结果返回 -1

Posted

技术标签:

【中文标题】List.IndexOf 结果返回 -1【英文标题】:List.IndexOf returning -1 as a result 【发布时间】:2021-02-12 15:54:12 【问题描述】:

所以我有一个名为“DisplayTextBlock”的函数,它显示 TextBlock。我已经制作了这个函数的列表,但每当我尝试在该列表中查找函数索引时,我得到 -1。

    public void DisplayTextBlock(TextBlock block)

    Doing something here.        



int myActiveTextIndex;

    textDisplay.Add(() => DisplayTextBlock(block1 = new TextBlock("1. some text here")));
    textDisplay.Add(() => DisplayTextBlock(block2 = new TextBlock("2. some text here")));
    textDisplay.Add(() => DisplayTextBlock(block3 = new TextBlock("3.some text here")));
    textDisplay.Add(() => DisplayTextBlock(block4 = new TextBlock("4.some text here")));

List<Action> textDisplay = new List<Action>();


    myActiveTextIndex = textDisplay.IndexOf(() => DisplayTextBlock(block3));

为什么会输出-1?

【问题讨论】:

我从不相信 Action 或 Func 实例相等比较的结果。即使它们看起来相同,但通常会导致“不一样”。 这些动作不一样,因为它们做不同的事情——第一个在调用方法之前将一些东西分配给变量,而第二个只是调用方法。因此,编译器将为每个 Action 委托生成 2 个不同的方法。 我认为伊万的评论指出了问题所在,所以删除了我自己的答案 谢谢 Ivan 和 MyBug。非常感谢您的帮助,我知道我做错了什么。 你在最后做了一个新列表,所以根除原来的ergo,里面什么都没有 【参考方案1】:

代表有这种平等的概念,如documentation 所述:

方法和目标的相等性比较如下:

如果被比较的两个方法都是静态的并且是相同的 同一个类上的方法,这些方法被认为是相等的,并且 目标也被认为是相等的。

如果被比较的两个方法是实例方法并且是 同一对象上的相同方法,这些方法被认为是相等的,并且 目标也被认为是相等的。

否则,方法不被认为是相等的,目标 也被认为不相等。

您正在使用匿名方法,例如() =&gt; DisplayTextBlock(block3),即使匿名方法 A 与匿名方法 B 做同样的事情(顺便说一句,您的代码中并非如此) - 它们仍然被编译成 不同的方法。这意味着它们在上面的比较中总是会违反same method,并且永远不会相等。

如果您想将委托存储在某种列表中以供以后检索 - 不要依赖委托相等性比较 - 使用 Dictionary 并使用适当的密钥,以便以后检索关联的委托。

【讨论】:

【参考方案2】:

-1 表示在列表中找不到项目https://docs.microsoft.com/en-us/dotnet/api/system.string.indexof?view=netcore-3.1

【讨论】:

我希望 OP 知道这一点,但不知道为什么找不到他们的项目。 是的,我不明白为什么在列表中找不到我的项目。我知道我在某处做错了什么,但就是想不通。

以上是关于List.IndexOf 结果返回 -1的主要内容,如果未能解决你的问题,请参考以下文章

vue实现跨区域拖放

List常用方法

TStringList 常用方法与属性

list一些操作方法的总结i

数组去重

javascript中判断list中是不是包含[该怎么写