【问题标题】:C# Initialize Dictionary Containing Dynamic Array of Dynamic ArraysC# 初始化包含动态数组的动态数组的字典
【发布时间】:2017-06-05 17:56:15
【问题描述】:

如您所见,我正在尝试初始化包含动态数组的动态数组的字典。有人可以给我一个更清洁的方法吗?一定有办法用 for 循环来做到这一点。

// 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() }
    }
});

【问题讨论】:

  • 你为什么还要使用dynamic?您可以为此创建强类型并将类型安全添加到您的代码中。此外,您在每个数组中添加了 2x 相同的值,并且每个数组都与之前的数组完全相同(它们都是相同的)。最后,你为什么要对单个值使用列表,为什么不直接使用 stringdecimal 而不是 List&lt;string&gt;List&lt;decimal&gt;
  • 最内层的动态数组是否总是像您展示的那样使用相同的值进行初始化?

标签: c# asp.net arrays dictionary dynamic


【解决方案1】:

不知道你为什么要使用动态,但你可以这样做:

创建一个函数来创建您最内部的动态数组之一:

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 个参数。此外,如果所有最内层的动态数组都将具有相同的内容,您可以进一步简化它。

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多