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".
的元素
你有什么建议吗?
假设您的 longDescContainers
是 TextBox
的集合。我怀疑比较 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);
我有一个 IEnumerable<TextBox>
。其中一个元素有 Tag
。我想用这种方式过滤我的第一个 IEnumerable
:
IEnumerable<TextBox> longDescContainersTag =
longDescContainers.Where(i => i.Tag == "DescrOp");
where 条件不起作用,它根本找不到任何文本框,序列为空。但是如果我快速观察 longDescContainers
它有一个标签为 "DescrOp".
你有什么建议吗?
假设您的 longDescContainers
是 TextBox
的集合。我怀疑比较 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);