適用されたルールに従って、特定のフィールドの値を取得するために、オブジェクト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);
}
}
}
おそらくそれを達成するのは簡単で、どこかでこの問題が議論されています。しかし、私は本当にそれをグーグルする方法さえ知りません。