解释这个LINQ代码?

Xai*_*oft 1 .net c# linq

我问了一个问题,其中一个响应包含以下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总新手吗?

Nei*_*ams 5

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表达式的语法.

  • 'var'是要求编译器根据变量赋值来推断变量类型的简写.是的,您确实可以用List <ListItem>替换它.这真的是一个偏好问题.大多数人会在这里使用'var'因为.Cast <ListItem>调用和.ToList()调用很容易看出它是List <ListItem>. (2认同)