我正在将Silverlight应用转换为WPF。下面的代码没有编译,但它在Silverlight中完成:
XAML:
<Grid x:Name="Table">
</Grid>
代码背后:
foreach (var uiElement in Table.Children
.Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
//do something
}
在Where
它说
'UIElementCollection'不包含'Where'和no的定义 扩展方法'where'接受类型的第一个参数 可以找到'UIElementCollection'(你错过了使用吗? 指令或程序集引用?)
System.Linq
名称空间已添加。
如果我将UIElementCollection
投射到IList<object>
,那么它可行,但我收到警告:
这是一个可疑的演员
我做错了什么?
答案 0 :(得分:3)
在Silverlight中,UIElementCollection
实现了IEnumerable<T>
,但WPF中的UIElementCollection
实现了IEnumerable
,而不是IEnumerable<T>
。如果你想在这里使用LINQ,你可以
使用OfType<UIElement>()
作为选项:
foreach (var uiElement in Table.Children.OfType<UIElement>()
.Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
//do something
}
答案 1 :(得分:3)
您的代码无法编译,因为UIElementCollection实现了非泛型集合接口,而Linq需要通用集合接口。
您可以使用Cast<T>()方法获取IEnumerable<T>
的实例,然后使用Linq:
var children = Table.Children.Cast<UIElement>();
foreach (var uiElement in children .Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
//do something
}
答案 2 :(得分:3)
问题是UIElementCollection
没有实现通用IEnumerable<T>
:
public class UIElementCollection : IList, ICollection, IEnumerable
虽然Enumerable.Where
扩展方法需要通用版本:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, int, bool> predicate
)
所以,解决方案是先抛出元素:
foreach (var uiElement in Table.Children.OfType<UIElement>().Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
}