2017-01-20 3 views
0

ご覧のとおり、ダイナミックアレイのダイナミックアレイを含むディクショナリを初期化しようとしています。誰かが私にこれを行うよりクリーンな方法を与えることができますか? forループでこれを行う方法が必要です。C#ダイナミックアレイのダイナミックアレイを含むディクショナリの初期化

// Sizes: 20X, 40X, W, M, WM, Other 
sizesDict.Add(eDate, new dynamic[6] { // Date, Size 
    new dynamic[6] { // Data 
     /* RangeMax */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* RangeMin */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* OriginMax */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* OriginMin */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* DestinationMax */ 
     new List<string> { r.destinationLoc.LocationName.ToString() }, 
     /* DestinationMin */ 
     new List<string> { r.destinationLoc.LocationName.ToString() } 
    }, 
    new dynamic[6] { // Data 
     /* RangeMax */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* RangeMin */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* OriginMax */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* OriginMin */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* DestinationMax */ 
     new List<string> { r.destinationLoc.LocationName.ToString() }, 
     /* DestinationMin */ 
     new List<string> { r.destinationLoc.LocationName.ToString() } 
    }, 
    new dynamic[6] { // Data 
     /* RangeMax */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* RangeMin */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* OriginMax */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* OriginMin */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* DestinationMax */ 
     new List<string> { r.destinationLoc.LocationName.ToString() }, 
     /* DestinationMin */ 
     new List<string> { r.destinationLoc.LocationName.ToString() } 
    }, 
    new dynamic[6] { // Data 
     /* RangeMax */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* RangeMin */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* OriginMax */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* OriginMin */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* DestinationMax */ 
     new List<string> { r.destinationLoc.LocationName.ToString() }, 
     /* DestinationMin */ 
     new List<string> { r.destinationLoc.LocationName.ToString() } 
    }, 
    new dynamic[6] { // Data 
     /* RangeMax */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* RangeMin */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* OriginMax */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* OriginMin */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* DestinationMax */ 
     new List<string> { r.destinationLoc.LocationName.ToString() }, 
     /* DestinationMin */ 
     new List<string> { r.destinationLoc.LocationName.ToString() } 
    }, 
    new dynamic[6] { // Data 
     /* RangeMax */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* RangeMin */ 
     new List<decimal> { r.rateEvalDLoc.rateEvalOLoc.charge.Total }, 
     /* OriginMax */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* OriginMin */ 
     new List<string> { r.rateEvalDLoc.originLoc.LocationName.ToString() }, 
     /* DestinationMax */ 
     new List<string> { r.destinationLoc.LocationName.ToString() }, 
     /* DestinationMin */ 
     new List<string> { r.destinationLoc.LocationName.ToString() } 
    } 
}); 
+1

なぜあなたは 'dynamic'を使用していますか?これに対して強力な型を作成し、コードに型安全性を追加することができます。また、各配列に2倍の同じ値を追加します。各配列は、前のものと全く同じです(すべて同じです)。最後になぜリストを単一の値に使うのですか? 'List 'と 'List 'の代わりに 'string'や' decimal'を使うのはなぜですか? – Igor

+0

あなたが表示するように、最も内側の動的配列は常に同じ値で初期化されますか? – gunnerone

答えて

2

ないのはなぜあなたがダイナミクスを使用していることを確認しますが、このようにそれを行うことができます:

あなたの最も内側の動的配列の一つを作成するための関数を作成します。次に

private static dynamic[] GetDataArray(
    decimal rangeMax, 
    decimal rangeMin, 
    string originMax, 
    string originMin, 
    string destMax, 
    string destMin) 
{ 
    return new dynamic[6] { // Data 
     /* RangeMax */ 
     new List<decimal> { rangeMax }, 
     /* RangeMin */ 
     new List<decimal> { rangeMin }, 
     /* OriginMax */ 
     new List<string> { originMax }, 
     /* OriginMin */ 
     new List<string> { originMin }, 
     /* DestinationMax */ 
     new List<string> { destMax }, 
     /* DestinationMin */ 
     new List<string> { destMin } 
    }; 
} 

をその関数を6回呼び出すと、それぞれの動的配列が最も外側の動的配列に追加されます。最後に、その配列を辞書に追加します。

dynamic[] allData = new dynamic[6]; 
for (int i = 0; i < allData.Length; i++) 
{ 
    allData[i] = GetDataArray(
     r.rateEvalDLoc.rateEvalOLoc.charge.Total, 
     r.rateEvalDLoc.rateEvalOLoc.charge.Total, 
     r.rateEvalDLoc.originLoc.LocationName.ToString(), 
     r.rateEvalDLoc.originLoc.LocationName.ToString(), 
     r.destinationLoc.LocationName.ToString(), 
     r.destinationLoc.LocationName.ToString()); 
} 

sizesDict.Add(eDate, allData); 

のRangeMaxは常にRangeMinに等しいことになるだろう、とOriginMax == OriginMin、およびDestinationMax == DestinationMinされている場合は、あなたが唯一の3つの引数を持っている機能を簡素化することができに。また、最も内側にある動的配列のすべてが同じ内容を持つ場合、それをさらに単純化することができます。

関連する問題