在 C# 中使用 ForEach 循环遍历 IEnumerable

本文关键字:循环 遍历 IEnumerable ForEach | 更新日期: 2023-09-27 18:34:44

我正在尝试遍历一个 IEnumerable,但由于某种原因它没有通过 foreach 循环,因为每个 ChartClass 的值都没有被修改。

public IEnumerable<ChartClass> get(string ID, string buildname, string placeholder)
    {
        var context = new Entities();
        var metrics = from c in context.VSTS_CODE_METRICS
                      where c.BUILD_NAME == buildname && c.OBJECT_TYPE == "Namespace"
                      group c by c.BUILD_ID into g
                      select new ChartClass
                      {
                          Build_ID = g.Key,
                          BuildTrim = g.Key,
                          Index = g.Average(c => c.MAINTAINABILITYINDEX_).Value
                      };
        foreach (var i in metrics)
        {
            int num = i.BuildTrim.LastIndexOf('_');
            i.BuildTrim = "2";
        }       
        return metrics;
    }

我正在尝试将每个 ChartClass 的 BuildTrim 字段更改为"2",但由于某种原因没有发生

在 C# 中使用 ForEach 循环遍历 IEnumerable

为什么不在查询中将 BuildTrim 设置为等于"2"?

public IEnumerable<ChartClass> get(string ID, string buildname, string placeholder)
    {
        var context = new Entities();
        var metrics = from c in context.VSTS_CODE_METRICS
                      where c.BUILD_NAME == buildname && c.OBJECT_TYPE == "Namespace"
                      group c by c.BUILD_ID into g
                      select new ChartClass
                      {
                          Build_ID = g.Key,
                          BuildTrim = "2",//g.Key,
                          Index = g.Average(c => c.MAINTAINABILITYINDEX_).Value
                      };
        /*foreach (var i in metrics)
        {
            int num = i.BuildTrim.LastIndexOf('_');
            i.BuildTrim = "2";
        }*/       
        return metrics;
    }

metrics是一个IQueryable。 每次迭代对象时,它都会转到数据库,查询要请求的项,将它们放入指定的对象中,然后允许迭代这些对象。 您正在修改要返回的对象,但如果再次迭代序列,则不会使用这些相同的内存中对象。 相反,它会第二次返回到数据库,并拉回没有更改的新查询。

如另一个答案中所述,如果您只是修改第一个Select调用以将BuildTrim设置为所需的值,而不是修改即将被丢弃的对象,则查询将按预期工作。