0

リスト 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 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++;
            }

しかし、私はこのエラーが発生しています

「PantaRei.Components.Dars」には「GetEnumerator」のパブリック定義が含まれていないため、foreach ステートメントは「PantaRei.Components.Dars」型の変数を操作できません

これを解決するにはどうすればよいですか?

4

2 に答える 2

10

クラスがたまたまfloats であるプロパティのコレクションを持っているからといって、それがコレクションになるわけではありません。あなたのコードは、ある種のデータバインディングでより適切に行われることを行っているようです。あなたがやろうとしていることは、インターフェイスDarsを実装しているとマークし、クラスのフロート プロパティの値を返すメソッドの実装を追加することで実行できますが、コード レビューでこのアプローチを容認することは決してありません。そうは言っても、これを試してください(必要な場合):IEnumerableGetEnumerator

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;
    }
}
于 2012-08-23T16:59:51.600 に答える
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[]

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

もちろん、それが望ましくない場合は、順序を調整する必要があります。

(余談ですが、これらは非常にぞっとするようなプロパティ名です。本当にコードが公開しているものなのでしょうか?)

于 2012-08-23T16:57:29.923 に答える