好的,我可以说我有以下课程:
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 });
}
}
答案 0 :(得分:1)
几点意见
data
中无需ref
个ProcessKPI
参数。 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的答案提供了一些优秀的建议。