我有IEnumerable<TextBox>
。其中一个元素有Tag
。我想以这种方式过滤我的第一个IEnumerable
:
IEnumerable<TextBox> longDescContainersTag =
longDescContainers.Where(i => i.Tag == "DescrOp");
where条件不起作用,它根本找不到任何TextBox,序列为空。但是,如果我快速观察longDescContainers
它有一个带有Tag&#34; DescrOp&#34;的元素。
你有什么建议吗?
答案 0 :(得分:4)
从您的问题中不清楚,但我假设您的where
- 条件是正确的,但是您没有得到任何结果,尽管源集合确实包含条件应该匹配。
我说应该,因为Control.Tag
是一个对象,使用i.Tag == "DescrOp"
将通过引用而不是按值进行比较。
即使字符串相等,也可能会返回true
。你应该做的是先将i.Tag
投射到字符串,即(string)i.Tag == "DescrOp"
。
答案 1 :(得分:1)
1-你确定.Tag包含字符串值吗?在某些情况下,当我们观看监视窗口时显示对象的名称。实际上cals对象的“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”,则上面的代码将返回它。
您可以使用“1”和“2”的复合,并使用以下代码:
IEnumerable<TextBox> longDescContainersTag = longDescContainers.
Where(i => i.GetType() == typeof(TextBox) && i.Tag.ToString() == "DescrOp")
.Select(t=> (TextBox)t);
答案 2 :(得分:0)
假设您的longDescContainers
是TextBox
的集合。我怀疑将Tag
(对象)与"DescrOp"
(字符串)进行比较失败。尝试使用ToString()
..
IEnumerable<TextBox> longDescContainersTag = longDescContainers.Where(i => i.Tag!=null && i.Tag.ToString() == "DescrOp");