C# Linq查询:其中条件产生一个空序列,即使应该有一个匹配

C# Linq查询:其中条件产生一个空序列,即使应该有一个匹配,c#,linq,ienumerable,C#,Linq,Ienumerable,我有一个IEnumerable。其中一个元素有一个标记。我想用以下方式过滤我的第一个IEnumerable: IEnumerable<TextBox> longDescContainersTag = longDescContainers.Where(i => i.Tag == "DescrOp"); IEnumerable LongdesContainerTag= 其中(i=>i.Tag==“DescrOp”); where条件不起作用,它根本找不到任何文本框,序

我有一个
IEnumerable
。其中一个元素有一个
标记
。我想用以下方式过滤我的第一个
IEnumerable

IEnumerable<TextBox> longDescContainersTag = 
    longDescContainers.Where(i => i.Tag == "DescrOp");
IEnumerable LongdesContainerTag=
其中(i=>i.Tag==“DescrOp”);
where条件不起作用,它根本找不到任何文本框,序列为空。但是,如果我快速查看
longdesccainers
,它有一个标记为“DescrOp”的元素


您有什么建议吗?

假设您的
longdesccainers
文本框的集合。我怀疑将
标记
(对象)与
“DescrOp”
(字符串)进行比较失败。。尝试使用
ToString()

IEnumerable longDescContainersTag=longDescContainers.Where(i=>i.Tag!=null&&i.Tag.ToString()==“DescrOp”);

假设您的
longdesccainers
文本框的集合。我怀疑将
标记
(对象)与
“DescrOp”
(字符串)进行比较失败。。尝试使用
ToString()

IEnumerable longDescContainersTag=longDescContainers.Where(i=>i.Tag!=null&&i.Tag.ToString()==“DescrOp”);

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

我之所以说应该,是因为
Control.Tag
是一个对象,使用
I.Tag==“DescrOp”
将通过引用而不是通过值进行比较


即使字符串相等,也可能返回或不返回
true
。您应该首先将
i.Tag
强制转换为string,即
(string)i.Tag==“DescrOp”

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

我之所以说应该,是因为
Control.Tag
是一个对象,使用
I.Tag==“DescrOp”
将通过引用而不是通过值进行比较


即使字符串相等,也可能返回或不返回
true
。您应该首先将
i.Tag
强制转换为字符串,即
(string)i.Tag==“DescrOp”

1-您确定。标记包含字符串值吗?在某些情况下,当我们观看“监视”窗口时,会显示对象的名称。实际调用对象的“ToString()”方法并显示它。我认为您可以使用以下代码:

IEnumerable<TextBox> longDescContainersTag = 
    longDescContainers.Where(i => i.Tag.ToString() == "DescrOp");
    IEnumerable<TextBox> longDescContainersTag = longDescContainers.
    Where(i => i.GetType() == typeof(TextBox) && i.Tag == "DescrOp").
Select(t=> (TextBox)t);
如果LongDescContainerTag甚至包含任何类型为“TextBox”的对象,则该标记为“DescrOp”,上面的代码将返回该标记

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

    IEnumerable<TextBox> longDescContainersTag = longDescContainers.
    Where(i => i.GetType() == typeof(TextBox) && i.Tag.ToString() == "DescrOp")
.Select(t=> (TextBox)t);
IEnumerable LongdesContainerTag=LongdesContainers。
其中(i=>i.GetType()==typeof(TextBox)和&i.Tag.ToString()==“DescrOp”)
.选择(t=>(文本框)t);

1-是否确定。标记包含字符串值?在某些情况下,当我们观看“监视”窗口时,会显示对象的名称。实际调用对象的“ToString()”方法并显示它。我认为您可以使用以下代码:

IEnumerable<TextBox> longDescContainersTag = 
    longDescContainers.Where(i => i.Tag.ToString() == "DescrOp");
    IEnumerable<TextBox> longDescContainersTag = longDescContainers.
    Where(i => i.GetType() == typeof(TextBox) && i.Tag == "DescrOp").
Select(t=> (TextBox)t);
如果LongDescContainerTag甚至包含任何类型为“TextBox”的对象,则该标记为“DescrOp”,上面的代码将返回该标记

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

    IEnumerable<TextBox> longDescContainersTag = longDescContainers.
    Where(i => i.GetType() == typeof(TextBox) && i.Tag.ToString() == "DescrOp")
.Select(t=> (TextBox)t);
IEnumerable LongdesContainerTag=LongdesContainers。
其中(i=>i.GetType()==typeof(TextBox)和&i.Tag.ToString()==“DescrOp”)
.选择(t=>(文本框)t);

在末尾添加
.ToList()
是否可以指定“不工作”?定义“不工作”?请包括一个小的代码片段,重现问题。您目前的检查区分大小写…只是一个想法。是否要从列表中排除其
标记
属性等于
DescrOp
文本框
?或者你只想包含那个文本框?@Galma88:你可能已经注意到编译器警告说你错误地通过引用进行比较了,不是吗?通常情况下,这不是字符串的问题,因为它们是被拘留的。但在某些情况下,它们不是内部的(例如,如果您在调试器中对它们求值,或者使用字符串构造函数,或者它们不是文本字符串)。在末尾添加
.ToList()
,您可以指定“不起作用”吗?定义“不起作用”?请包括一个小的代码片段,重现问题。您目前的检查区分大小写…只是一个想法。是否要从列表中排除其
标记
属性等于
DescrOp
文本框
?或者你只想包含那个文本框?@Galma88:你可能已经注意到编译器警告说你错误地通过引用进行比较了,不是吗?通常情况下,这不是字符串的问题,因为它们是被拘留的。但在某些情况下,它们不是内部的(例如,如果您在调试器中对它们求值,或者使用字符串构造函数,或者它们不是文本字符串)。OP的要点是它们已选中
longDescContainers
,并且它有一个应与筛选器匹配的项,但并非如此。@bit推测那些否决票是在你完全改变答案之前产生的。@bit推测那些否决票是在你完全改变答案之前产生的。@bit OP的要点是他们已经检查了
longDescContainers
,并且它有一个应该与过滤器匹配的项目,但不是。@bit推测那些否决票是在你完全改变答案之前产生的。…好消息,虽然我相当确定字符串interning使它们成为相同的引用。@bit:您在原始答案上获得了反对票,该答案是:“您需要观看
LongdesContainers标签
,而不是
LongdesContainers
”@TimSchmelter是的,但这取决于标签中的字符串来自何处。如果它也是硬编码的,那么引用比较将返回true(很可能),但是如果它是DB查询的结果,那么就不是了。@TimSchmelter,我明白了。T