在UIElementCollection上使用Where表达式

时间:2017-10-09 13:13:36

标签: c# wpf linq xaml

我正在将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>,那么它可行,但我收到警告:

  

这是一个可疑的演员

我做错了什么?

3 个答案:

答案 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))
{
}
相关问题