在 UIElementCollection 上使用 Where 表达式

Ozk*_*kan 3 c# linq wpf xaml

我正在将 Silverlight 应用程序转换为 WPF。下面的代码没有编译,但它在 Silverlight 中编译:

XAML:

<Grid x:Name="Table">
</Grid>
Run Code Online (Sandbox Code Playgroud)

后面的代码:

foreach (var uiElement in Table.Children
            .Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
   //do something
}
Run Code Online (Sandbox Code Playgroud)

Where它说

“UIElementCollection”不包含“Where”的定义,并且找不到接受“UIElementCollection”类型的第一个参数的扩展方法“Where”(您是否缺少 using 指令或程序集引用?)

System.Linq 添加了命名空间。

如果我转换UIElementCollection为 anIList<object>那么它可以工作,但我收到警告:

这是一个可疑的演员

我究竟做错了什么?

Sal*_*ari 7

在 Silverlight 中,UIElementCollection实现了IEnumerable<T>,但UIElementCollection在 WPF 中实现了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
}
Run Code Online (Sandbox Code Playgroud)


SO *_*ood 5

问题是UIElementCollection没有实现泛型IEnumerable<T>

public class UIElementCollection : IList, ICollection, IEnumerable
Run Code Online (Sandbox Code Playgroud)

虽然Enumerable.Where扩展方法需要通用版本:

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource,?int,?bool> predicate
)
Run Code Online (Sandbox Code Playgroud)

因此,解决方案是首先投射元素:

foreach (var uiElement in Table.Children.OfType<UIElement>().Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
}
Run Code Online (Sandbox Code Playgroud)