C#泛型效率,更好的方法

时间:2011-04-04 19:45:04

标签: c# generics collections

好的,我可以说我有以下课程:

public class KPIObject<T> //<--This class where T is the following classes
{
    public List<T> Data { get; set; }
    public string Caption { get; set; }
}

public class KPICycleCountAccuracyData //<--There are 20 of these with different names and values
{
    public string Facility { get; set; }
    public string CCAdjustedCases { get; set; }
    public string TotalCases { get; set; }
    public string CCAdjustedPercent { get; set; }
}

然后我有:

public List<ReportData>> ProcessAccountReport(GetAccountReport request)
{
    var data = new List<ReportData>();
    ProcessKPI(data, request.KPICycleCountAccuracy, "KPICycleCountAccuracy"); //<-- 20 of these
    return data;
}

这是ProcessKPI方法:

private static void ProcessKPI<T>(List<ReportData> data, ICollection<KPIObject<T>> items, string name)
{
    if (items == null || items.Count <= 0) return;
    foreach (var item in items)
    {
        if (item.Data == null || item.Data.Count <= 0) continue;
        var temp = new List<object>();
        temp.AddRange((IEnumerable<object>)item.Data);
        data.Add(new ReportData { Data = temp, Name = name, Title = item.Caption });
    }
}

所有这些都可以正确编译,我只是想知道这是否是最有效的方法。

感谢。

修改

我将流程KPI更改为:

private static void ProcessKPI<T>(ICollection<ReportData> data, ICollection<KPIObject<T>> items, string name)
        {
            if (items == null || items.Count <= 0) return;
            foreach (var item in items.Where(item => item.Data != null && item.Data.Count > 0))
            {
                data.Add(new ReportData { Data = (IEnumerable<object>)item.Data, Name = name, Title = item.Caption });
            }
        }

2 个答案:

答案 0 :(得分:1)

几点意见

  • data中无需refProcessKPI参数。 ref参数仅对C#中的class类型有意义,如果您实际分配给它。在这里,您只是修改对象,因此ref除了笨拙的调用语法
  • 之外没有任何其他内容
  • 即使Count已签名,也不会返回负值。
  • 我希望(IEnumerable<object>)item.Data超过as IEnumerable<object>版本。如果后者失败,那么当它真的是一个投射问题时,它将导致ArgumentNullException

答案 1 :(得分:1)

<强>速度 假设您正在谈论计算效率(即速度),您可以通过两种操作来改进:

首先,您在item.Data变量中创建temp的副本。当您知道永远不会修改生成的ReportData时,您可以直接使用item.Data,从而放弃昂贵的复制操作。

data.Add(new ReportData { Data = (IEnumerable<object>)item.Data, Name = name, Title = item.Caption });

其次,转换为IEnumerable<object>可能会在以后导致不必要的装箱/拆箱。看看您的应用程序是否有必要将通用类型参数添加到ReportData,因此您可以将其实例化为new ReportData<KPIObject>()。这样编译器可以更好地优化代码。

<强>内存 通过使用continuation实现解决方案,您可以一次处理一个ReportData元素,而不是一次处理所有元素,从而减少内存占用。看看yield语句,看看如何阻止这种方法。

其他 为了进一步提高代码质量,JaredPar的答案提供了一些优秀的建议。