Linq 查询:即使应该有一个匹配项,条件也会产生一个空序列

Linq query: where condition yields an empty sequence even if there should be one match

我有一个 IEnumerable<TextBox>。其中一个元素有 Tag。我想用这种方式过滤我的第一个 IEnumerable

IEnumerable<TextBox> longDescContainersTag = 
    longDescContainers.Where(i => i.Tag == "DescrOp");

where 条件不起作用,它根本找不到任何文本框,序列为空。但是如果我快速观察 longDescContainers 它有一个标签为 "DescrOp".

的元素

你有什么建议吗?

假设您的 longDescContainersTextBox 的集合。我怀疑比较 Tag (对象)与 "DescrOp" (字符串)失败。尝试使用 ToString()..

IEnumerable<TextBox> longDescContainersTag = longDescContainers.Where(i => i.Tag!=null && i.Tag.ToString() == "DescrOp");

从你的问题中不清楚,但我假设你的 where 条件是正确的,但你没有得到任何结果,尽管源集合确实包含一个元素,其中条件 应该匹配。

我说应该因为Control.Tag是一个对象,使用i.Tag == "DescrOp"将通过引用而不是通过值进行比较。

这可能会也可能不会 return true 即使字符串相等。你应该做的是首先将 i.Tag 转换为字符串,即 (string)i.Tag == "DescrOp".

1- 您确定 .Tag 包含字符串值吗?在某些情况下,当我们观看手表 window 时,会显示一个对象的名称。实际上调用对象的 "ToString()" 方法并显示它。我认为您可以使用此代码:

IEnumerable<TextBox> longDescContainersTag = 
    longDescContainers.Where(i => i.Tag.ToString() == "DescrOp");

2- 您确定“longDescContainers”中的所有对象都是“TextBox”类型吗? 我不知道什么是 "longDescContainers" 对象,但在某些容器对象中,我们需要像这样的代码“longDescContainers.cast<TextBox>().where(....)”来转换它们的子项(控件)。 如果您不确定 "longDescContainers" 中的所有对象都是 TextBox 您可以尝试此代码:

    IEnumerable<TextBox> longDescContainersTag = longDescContainers.
    Where(i => i.GetType() == typeof(TextBox) && i.Tag == "DescrOp").
Select(t=> (TextBox)t);

如果 longDescContainersTag 甚至包含 "TextBox" 类型的任何对象,该标签就是 "DescrOp" 上面的代码 returns 它。

您可以使用“1”和“2”的组合并使用以下代码:

    IEnumerable<TextBox> longDescContainersTag = longDescContainers.
    Where(i => i.GetType() == typeof(TextBox) && i.Tag.ToString() == "DescrOp")
.Select(t=> (TextBox)t);