使用 LINQ 重构 WPF 网格.子迭代方法



我的目标是将此 foreach 逻辑转换为单个 LINQ 查询。

foreach (var anyItem in gridReference.Children)
{
    var enumerableCheck = anyItem as ListBox; 
    if (enumerableCheck != null)
    {
        foreach (var collectionItem in enumerableCheck.Items)
        {
            //check collectionItem is of type T
        }
    } 
    else
    {                    
        //check anyItem is of type T
    }
}

我尝试通过这种重构来学习 linq,但语法错误确实令人讨厌,因为我已经习惯了 C#。我也不知道如何在 linq 中分配一个工作变量,这会导致常量强制转换。

尝试:

IEnumerable <T> genericQuery = from UIElement element1 in gridReference.Children
                               where (element1 as ListBox) != null
                               from item in (element1 as ListBox).Items
                               where (item as T) != null
                               select (item as T)
                               from UIElement element2 in gridReference.Children
                               where element2 as T != null
                               select element2;  

我认为在 linq 中使用let子句来检查该转换是完美的例子。https://msdn.microsoft.com/en-us/library/bb383976.aspx

若要确保仅返回符合 T 的项目,可以使用OfType<T>

List<T> result = (from element1 in gridReference.Children
                        let el1ListBox = element1 as ListBox
                        where el1ListBox != null 
                        select el1ListBox.Items.OfType<T>()).ToList();

编辑:

根据评论:

List<T> result = (from element1 in gridReference.Children.OfType<ListBox>().ToList()
                        select element1.Items.OfType<T>()).ToList();

由于madOX的鼓励性回复,我测试了一个工作查询。

IEnumerable <T> genericQuery = (from element1 in gridReference.Children.OfType <ListBox>()
                                from boxItem in element1.Items.OfType <T>()
                                select boxItem)
                                .Concat (from element2 in gridReference.Children.OfType <T>()
                                select element2);

最新更新