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