0

適用されたルールに従って、特定のフィールドの値を取得するために、オブジェクトSearchConsequencesを反復処理し、いくつかのタスクを実行するために呼び出されたこのメソッドを使用します。List<ValuesEO>このコードを何とか簡素化したい。

コードのブロック全体で、コード内のどこでもValuesEO[i].powerR他の式を切り替え (置き換え) たいと考えています。ValuesEO[i].otherField

現時点では、ブロックコーピングと手動での変更だけでこれを行います。つまり、最後に、このメソッドには非常によく似たコード ブロックの 5 つのブロックがあるとしましょう。唯一の違いはValuesEO[i].otherField...ValuesEO[i].otherField2 ValuesEO[i].otherField3などです。

私はそのブロックコーピングが好きではありません。

public Dictionary<Consequence,Cause> SearchConsequences(List<ResultsCatcher> smallTable, int n, ConnectHYSYS obj, int keyP, int keyR)//for one stream for one parameter
    {
        double threshold = 0.005;

        Dictionary<Consequence,Cause> collection = new Dictionary<Consequence,Cause>();

        //search in ValesE for each energy stream, for powerR
        for (int i = 0; i < smallTable[n].ValuesE.Count; i++)
        {
            //sort the smallTable
            smallTable.Sort((x, y) => x.ValuesE[i].powerR.CompareTo(y.ValuesE[i].powerR));

            //get the index of first occurrence of powerR >= threshold, if there is nothing bigger than threshold, index is null
            var tagged = smallTable.Select((item, ii) => new { Item = item, Index = (int?)ii });
            int? index = (from pair in tagged
                          where pair.Item.ValuesE[i].powerR >= threshold
                          select pair.Index).FirstOrDefault();

            //get needed information
            if (index != null)
            {
                int id = Convert.ToInt16(index);

                double newValue = smallTable[id].ValuesE[i].power;
                double newValueR = smallTable[id].ValuesE[i].powerR;
                TypeOfValue kindOf = TypeOfValue.power;
                Consequence oneConsequence = new Consequence(obj.EnergyStreamsList[i], newValue, newValueR, kindOf);

                Cause oneCause = new Cause();
                oneCause.GetTableHeader(smallTable[id]);

                collection.Add(oneConsequence,oneCause);
            }
        }
    }

おそらくそれを達成するのは簡単で、どこかでこの問題が議論されています。しかし、私は本当にそれをグーグルする方法さえ知りません。

4

2 に答える 2

0

これは、基準/プロパティの選択を試験機能の外に移動する方法を示す既製のプログラムです。フィールド基準がどのように一致するかを確認してください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;

namespace Test
{
    class Program
    {
        public class PowerValues
        {
            public double power;
            public double powerR;
            public double lightbulbs;
            public double lightbulbsR;
        }

        public static void DoSomething(IEnumerable<PowerValues> powerValues, Func<PowerValues, double> criteria, double treshhold)
        {
            var flaggedElements = powerValues.Where(e => criteria(e) > treshhold);
            foreach (var flagged in flaggedElements)
            {
                Console.WriteLine("Value flagged: {0}", criteria(flagged));
            }
        }

        public static void Main(string[] args)
        {
            List<PowerValues> powerValues = new List<PowerValues>();

            powerValues.Add(new PowerValues(){power=10, powerR=0.002, lightbulbs = 2, lightbulbsR = 2.006});
            powerValues.Add(new PowerValues(){power=5, powerR=0.004, lightbulbs = 4, lightbulbsR = 2.09});
            powerValues.Add(new PowerValues(){power=6, powerR=0.003, lightbulbs = 3, lightbulbsR = 2.016});

            Console.WriteLine("Power matching criteria . . . ");
            DoSomething(powerValues, (e) => e.powerR, 0.003);
            Console.WriteLine("Lightbulbs matching criteria . . . ");
            DoSomething(powerValues, (e) => e.lightbulbs, 3);

            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}
于 2012-05-08T11:29:44.503 に答える
-2
  1. 2 回使用したコードを 1 つのメソッドに抽出します。
  2. 必要な値の列挙型を作成します (例: PowerR、OtherField)
  3. 列挙型をパラメーターとしてメソッドに追加します
  4. メソッド内のコードが変更された場所に switch ステートメントを追加します。
于 2012-05-08T11:22:25.313 に答える