我的目标是将此 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);