foreach语句不能对Dars类型的变量进行操作不包含'GetEnumerator'的公共定义

时间:2012-08-23 16:44:41

标签: c# list foreach ienumerator

我有一个名单Dars

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PantaRei.Components
{
    public class Dars
    {
        public float OpBal      { get; set; }
        public float PlNeOrRec  { get; set; }
        public float MiCaCol    { get; set; }
        public float MiDeCol    { get; set; }
        public float MiWrOff    { get; set; }
        public float ClBal      { get; set; }

        public float Tot
        {
            get { return OpBal+ PlNeOrRec+ MiCaCol + MiDeCol + MiWrOff; }
        }
    }
}

我创建了一个新的dars

Dars secA1 = new Dars();

然后我用这段代码来填补它

public static void GetData(ref Dars secA1, Ddr ddr, Ddrs ddrs, Type pTypes)
    {
        Array typesEnum = Enum.GetValues(pTypes);

        foreach (Enum types in typesEnum)
        {
            string pType = StringEnum.GetStringValue(types);

            secA1.OpBal = ddrs.Out.Sum(o => o.Amount);

            secA1.MiDeCol += ddr.Dil.Where(dil => dil.ProductType == pType && dil.ToBeSold).Sum(dil => dil.Amount);

            secA1.PlNeOrRec += ddr.Rec.Where(rec => rec.ToBeSold).Sum(rec => rec.Amount);

            GetMiCaCol(ref secA1, ddr, pType);
            GetMiWrOff(ref secA1, ddr, pType);
        }
    }

现在我想做这样的事情

int i = 11;
            foreach (float g in secA1)
            {
                daily.Cells[i, 4] = g;
                i++;
            }

但是我收到了这个错误

  

foreach语句不能对'PantaRei.Components.Dars'类型的变量进行操作,因为'PantaRei.Components.Dars'不包含'GetEnumerator'的公共定义

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:10)

仅仅因为一个类具有恰好是float的属性集合,它不会使它成为集合。您的代码似乎正在通过某种数据绑定执行更适当的操作。您尝试执行的操作可以通过将Dars标记为实现IEnumerable接口,并添加返回值的GetEnumerator方法的实现来完成 您的类中的float属性,但我绝不会在代码审查中宽恕这种方法。话虽这么说,试试这个(如果必须的话):

public class Dars : IEnumerable
{
    public float OpBal { get; set; }
    public float PlNeOrRec { get; set; }
    public float MiCaCol { get; set; }
    public float MiDeCol { get; set; }
    public float MiWrOff { get; set; }
    public float ClBal { get; set; }

    public float Tot
    {
        get { return OpBal + PlNeOrRec + MiCaCol + MiDeCol + MiWrOff; }
    }

    public IEnumerator GetEnumerator()
    {
        yield return this.OpBal;
        yield return this.PlNeOrRec;
        yield return this.MiCaCol;
        yield return this.MiDeCol;
        yield return this.MiWrOff;
        yield return this.ClBal;
        yield return this.Tot;
    }
}

答案 1 :(得分:6)

IEnumerable<float>

...或者您可以创建public class Dars { public float OpBal { get; set; } public float PlNeOrRec { get; set; } public float MiCaCol { get; set; } public float MiDeCol { get; set; } public float MiWrOff { get; set; } public float ClBal { get; set; } public IEnumerable<float> GetValues() { yield return OpBal; yield return PlNeOrRec; yield return MiCaCol; yield return MiDeCol; yield return MiWrOff; yield return ClBal; } public float Tot { get { return OpBal+ PlNeOrRec+ MiCaCol + MiDeCol + MiWrOff; } } } List<float>并从方法中返回:

float[]

当然,如果那不是你想要的,你应该调整顺序。

(顺便说一句,这些都是非常可怕的属性名称。它们真的是你的代码所暴露的吗?)