在C#中使用ForEach通过IEnumerable循环

时间:2013-10-10 18:44:44

标签: c# loops foreach ienumerable

我正在尝试遍历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”,但由于某种原因它没有发生

2 个答案:

答案 0 :(得分:3)

为什么不在查询中将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;
    }

答案 1 :(得分:1)

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

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