我问了一个问题,其中一个响应包含以下LINQ代码:
var selected = lstAvailableColors.Cast<ListItem>().Where(i => i.Selected).ToList();
selected.ForEach( x => { lstSelectedColors.Items.Add(x); });
selected.ForEach( x => { lstAvailableColors.Items.Remove(x);});
Run Code Online (Sandbox Code Playgroud)
有人可以解释上面的LINQ总新手吗?
LINQ运算符使用所谓的流畅接口,因此您可以将第一行读作一系列函数调用.假设lstAvailableColors是这样IEnumerable<T>,我们的想法是每个可用的颜色都流经LINQ运算符.
让我们分解一下:
var selected = lstAvailableColors
// each item is cast to ListItem type
.Cast<ListItem>()
// items that don't pass the test (Selected == true) are dropped
.Where(i => i.Selected)
// turn the stream into a List<ListItem> object
.ToList();
Run Code Online (Sandbox Code Playgroud)
编辑:正如JaredPar所指出的,上面(ToList())的最后一行非常重要.如果您不这样做,那么两个selected.ForEach调用中的每一个都将重新运行查询.这称为延迟执行,是LINQ的重要组成部分.
您可以像这样重写第一行:
var selected = new List<ListItem>();
foreach (var item in lstAvailableColors)
{
var listItem = (ListItem)item;
if (!listItem.Selected)
continue;
selected.Add(listItem);
}
Run Code Online (Sandbox Code Playgroud)
最后两行只是编写foreach循环的另一种方式,可以重写为:
foreach (var x in selected)
{
lstSelectedColors.Items.Add(x);
}
foreach (var x in selected)
{
lstAvailableColors.Items.Remove(X);
}
Run Code Online (Sandbox Code Playgroud)
学习LINQ最困难的部分可能是学习数据流和lambda表达式的语法.