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 所述:
方法和目标的相等性比较如下:
如果被比较的两个方法都是静态的并且是相同的 同一个类上的方法,这些方法被认为是相等的,并且 目标也被认为是相等的。
如果被比较的两个方法是实例方法并且是 同一对象上的相同方法,这些方法被认为是相等的,并且 目标也被认为是相等的。
否则,方法不被认为是相等的,目标 也被认为不相等。
您正在使用匿名方法,例如() => 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的主要内容,如果未能解决你的问题,请参考以下文章