【问题标题】:foreach statement cannot operate on variables of type Dars does not contain a public definition for 'GetEnumerator'foreach 语句不能对 Dars 类型的变量进行操作 不包含“GetEnumerator”的公共定义
【发布时间】:2012-08-19 06:06:04
【问题描述】:

我有一个 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”的公共定义

我该如何解决这个问题?

【问题讨论】:

  • 坦率地说,我会通过不尝试对明显不是集合的东西进行 foreach 来解决这个问题
  • 好的,我怎么把它变成一个集合?
  • 但是...但是...它不是一个集合...假装iy是非常不典型的

标签: c# list foreach ienumerator


【解决方案1】:

仅仅因为一个类有一个恰好是floats 的属性集合,它并不能使它成为一个集合。您的代码似乎正在做一些使用某种数据绑定更合适的事情。您尝试做的事情可以通过将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;
    }
}

【讨论】:

  • Tks。有用。是的,我也不喜欢这种方法,但这正是我需要的。我只会有一个 Dars,而不是它的列表,我确实需要迭代它。
  • 我不得不承认我不是一个开发者。所以我问你,你会怎么做?
【解决方案2】:

完全不清楚您要做什么,但您可能只想实现一个使用迭代器块返回 IEnumerable<float> 的方法: p>

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&lt;float&gt;float[] 并从方法中返回它:

public IEnumerable<float> GetValues()
{
    return new[] { OpBal, PlNeOrRec, MiCaCol, MiDeCol, MiWrOff, ClBal };
}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多