2017-01-20 2 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'? Вы можете создать для этого сильные типы и добавить к вашему типу безопасность типов. Также вы добавляете одинаковые значения 2x в каждом массиве, и каждый массив является точным дубликатом того, который был перед ним (они все одинаковы). Наконец, почему вы используете списки для одиночных значений, почему бы просто не использовать 'string' или' decimal' вместо 'List ' и' List '? – 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 аргумента. Кроме того, если все внутренние динамические массивы будут иметь одинаковое содержимое, вы можете значительно упростить его.