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

时间:2015-01-22 08:59:29

标签: c# linq ienumerable

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

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

where条件不起作用,它根本找不到任何TextBox,序列为空。但是,如果我快速观察longDescContainers它有一个带有Tag&#34; DescrOp&#34;的元素。

你有什么建议吗?

3 个答案:

答案 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)

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

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