【问题标题】:IEnumerable.First() returns "no matching element" despite what should be an identical element in the List [duplicate]IEnumerable.First() 返回“没有匹配的元素”,尽管列表中的元素应该是相同的 [重复]
【发布时间】:2020-02-06 19:08:52
【问题描述】:

我正在用 C# (WPF) 制作一个 noughts and crosss 游戏。这部分代码是玩家选择方块放入下一块后发生的事情的一部分 - 它使用一种方法将方块的坐标转换为单个整数,它可以与每个图像的标签 (1-9) 进行比较以找到正确的图像,然后它会更改其来源。图片、来源和标签是 WPF 特有的,但对这个问题来说重要的是我有一个图片列表,每个图片都有一个标签,它是一个对象。

int coordNumber = ReturnNumber(coordinates); //get integer version of coordinates, equivalent to clickedSquare
string coordString = coordNumber.ToString();
object coordObject = coordString;

SquareImages.First(image => image.Tag == coordObject).Source = new ImageSourceConverter().ConvertFromString("Data/Images/Cross.png") as ImageSource;

最后一行的.Source 部分不相关,因为它发生在错误之后。第二行和第三行是试图看看不同的投射方式是否会改变它是否可以找到具有正确标签的图像,但到目前为止还没有导致任何变化。两行已被删除,但不会以任何方式影响列表或显示的变量。

【问题讨论】:

  • 比较对象时,唯一的比较是它们是否引用了完全相同的对象。它不会进行字符串比较。你可以这样做:image.Tag?.ToString() == coordString
  • Tagobject 类型,所以如果你把int 塞进去,它就是boxed。这意味着无论int 的值如何,每个Tag 都有一个单独的对象。 (当您使用== 比较引用类型对象时,默认情况下它是引用值的比较,即底层指针)
  • 这能回答你的问题吗? Compare String and Object in C#
  • 如果 image.Tagobject 类型,但您确定它实际上包含一个 int,请取消装箱该 int,并将其与您的 coordNumber 进行比较,如下所示:SquareImages.First(image => (int)image.Tag == coordNumber)

标签: c# wpf


【解决方案1】:

固定代码段:

int coordNumber = ReturnNumber(coordinates); //get integer version of coordinates, equivalent to clickedSquare
string coordString = coordNumber.ToString();

SquareImages.First(image => (string) image.Tag == coordString).Source = new ImageSourceConverter().ConvertFromString("Data/Images/Cross.png") as ImageSource;

答案本质上是dumetrulo 所说的,但事实证明 Tag 可以转换为字符串而不是 int。

【讨论】:

  • 如果这是答案,则底层对象已经是一个字符串(不是 int),只需要从object 转换为string,就像您在此处所做的那样。原因是 string 实现了结构标识,即它比较字符,而 object 上的 == 将执行简单的引用相等。
猜你喜欢
  • 2020-10-11
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
相关资源
最近更新 更多