【问题标题】:Calling Select inside of List<> extended method in C#在 C# 中的 List<> 扩展方法中调用 Select
【发布时间】:2022-11-23 22:53:19
【问题描述】:

只是想知道如果在扩展方法内部调用 Select 调用为什么不会执行? 还是我认为 Select 只做一件事,而它的目的是不同的?

代码示例:

var someList = new List<SomeObject>();
int triggerOn = 5;
/* list gets populated*/
someList.MutateList(triggerOn, "Add something", true);

MutateList 方法声明:

    public static class ListExtension
    {
        public static IEnumerable<SomeObject> MutateList(this IEnumerable<SomeObject> objects, int triggerOn, string attachment, bool shouldSkip = false)
        {
            return objects.Select(obj =>
            {
                if (obj.ID == triggerOn)
                {
                    if (shouldSkip) shouldSkip = false;
                    else obj.Name += $" {attachment}";
                }
                return obj;
            });
        }
     }

没有 Select 的解决方案有效。我只是在做一个 foreach。

我知道 Select 方法有一个摘要:“将序列的每个元素投影到新形式中。”但如果那是真的,那么我的代码示例不会显示错误吗?

我使用的解决方案(在 MutateList 方法内部):

        foreach(SomeObject obj in objects)
        {
            if (obj.ID == triggerOn)
            {
                if (shouldSkip) shouldSkip = false;
                else obj.Name += $" {attachment}";
            }
        });
        return objects;

【问题讨论】:

  • 请注意Select 返回一个新的枚举。它不会修改它操作的可枚举。
  • “选择调用不会执行” - 你是如何检查它没有被执行的?
  • “没有 Select 的解决方案有效。” - 哪个解决方案没有选择?没有显示这样的解决方案。
  • @ThomasWeller 我有点小气,显示了列表的位置突变(磨碎它是列表中的项目而不是列表本身)
  • @ThomasWeller 我用解决方案更新了问题。我通过在 Select 中添加一个断点来测试它。

标签: c# select ienumerable


【解决方案1】:

Select 使用延迟执行,这意味着它实际上不会执行,直到您尝试迭代在结果上,使用 ForEach,或使用需要实际结果的 Linq 方法,如 ToListSum

还有,它返回一个迭代器,它不会在就地项目上运行,但您没有在调用代码中捕获返回值。

由于这些原因 - 我会推荐不是使用 Select 改变列表中的对象。您只是以不太干净的方式包装 ForEach 调用。我只会在方法中使用ForEach

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多