如何从LinqExtension方法中使用的lambda表达式体修改对象

本文关键字:lambda 表达式 对象 修改 LinqExtension 方法 | 更新日期: 2023-09-27 18:01:06

我想要将lambda表达式与Select扩展方法一起使用时的副作用,类似于以下内容:

using System;
using System.Collections.Generic;
using System.Linq;
namespace SyntaxExperiment {
    public class Program {
        static void Main() {
            var list = new List<int>();
            var results = new[] { 1, 2, 3 }
                .Select(
                    i => {
                        list.Add(i);
                        return i;
                    }   
                );
            Console.WriteLine(list.Count);
        }
    }
}

上面的代码输出:

0

这怎么可能?

如何从LinqExtension方法中使用的lambda表达式体修改对象

LINQ代码实际上并没有执行,因为它只是一个IEnumerable<int>,没有执行的理由。你可以强制它执行如下:
var results = new[] { 1, 2, 3 }
    .Select(i => {
        list.Add(i);
        return i;
    })
    .ToList();

换言之,可枚举通过其枚举

LINQ是基于函数式编程原理构建的,因此虽然它可以实现,但它并不是真正为改变数据或产生副作用而设计的。

您想要做的(假设实际代码比您的示例更复杂!(是选择必要的数据,然后将IEnumerable转换为List。

var results = new[] { 1, 2, 3 }.Select(i => i).ToList();

您也可以像下面的一样使用Foreach

static void Main()
{
    List<int> list = new List<int>();
    var results = new[] { 1, 2, 3 };
    results.ToList().ForEach(i => list.Add(i));
    Console.WriteLine(list.Count);
}