C# 如何编写泛型分组依据
我有下面的代码,唯一的区别是它分组数据的方式,是否有任何方法通过按参数分组来将其转换为一个逻辑,这样就可以删除重复的代码C# 如何编写泛型分组依据,c#,linq,C#,Linq,我有下面的代码,唯一的区别是它分组数据的方式,是否有任何方法通过按参数分组来将其转换为一个逻辑,这样就可以删除重复的代码 public interface IStackChartData { IReadOnlyCollection<StackChartData> GetDetails(StackChartSetting chartSetting); } public class DailyStack : IStackChartData { public IRea
public interface IStackChartData
{
IReadOnlyCollection<StackChartData> GetDetails(StackChartSetting chartSetting);
}
public class DailyStack : IStackChartData
{
public IReadOnlyCollection<StackChartData> GetDetails(StackChartSetting chartSetting)
{
return chartSetting.StackChartDataPoints.GroupBy(x => new { x.DataTime.Hour, x.RateId })
.OrderBy(x => x.Key.RateId).Select(cl => new StackChartData(
cl.Key.RateId,
cl.Key.Hour.ToString(CultureInfo.CurrentCulture),
cl.Sum(c => Convert.ToDecimal(c.YData)),
chartSetting.GetColorCode(cl.Key.RateId))).ToList();
}
}
public class MonthlyStack : IStackChartData
{
public IReadOnlyCollection<StackChartData> GetDetails(StackChartSetting chartSetting)
{
return chartSetting.StackChartDataPoints.GroupBy(x => new { x.DataTime.Date, x.RateId })
.OrderBy(x => x.Key.RateId).Select(cl => new StackChartData(
cl.Key.RateId,
cl.Key.Date.Day.ToString(CultureInfo.CurrentCulture),
cl.Sum(c => Convert.ToDecimal(c.YData)),
chartSetting.GetColorCode(cl.Key.RateId))).ToList();
}
}
public class YearlyStack : IStackChartData
{
public IReadOnlyCollection<StackChartData> GetDetails(StackChartSetting chartSetting)
{
return chartSetting.StackChartDataPoints.GroupBy(x => new { x.DataTime.Month, x.RateId })
.OrderBy(x => x.Key.RateId).Select(cl => new StackChartData(
cl.Key.RateId,
cl.Key.Month.ToString(CultureInfo.CurrentCulture),
cl.Sum(c => Convert.ToDecimal(c.YData)),
chartSetting.GetColorCode(cl.Key.RateId))).ToList();
}
}
公共接口IStackChartData
{
IReadOnlyCollection GetDetails(堆栈图表设置图表设置);
}
公共类DailyStack:IStackChartData
{
公共IReadOnlyCollection GetDetails(堆栈图表设置图表设置)
{
返回chartSetting.StackChartDataPoints.GroupBy(x=>new{x.DataTime.Hour,x.RateId})
.OrderBy(x=>x.Key.RateId)。选择(cl=>newstackChartData(
cl.Key.RateId,
cl.Key.Hour.ToString(CultureInfo.CurrentCulture),
cl.Sum(c=>Convert.ToDecimal(c.YData)),
chartSetting.GetColorCode(cl.Key.RateId)).ToList();
}
}
公共类MonthlyStack:IStackChartData
{
公共IReadOnlyCollection GetDetails(堆栈图表设置图表设置)
{
返回chartSetting.StackChartDataPoints.GroupBy(x=>new{x.DataTime.Date,x.RateId})
.OrderBy(x=>x.Key.RateId)。选择(cl=>newstackChartData(
cl.Key.RateId,
cl.Key.Date.Day.ToString(CultureInfo.CurrentCulture),
cl.Sum(c=>Convert.ToDecimal(c.YData)),
chartSetting.GetColorCode(cl.Key.RateId)).ToList();
}
}
公共类YearyStack:IStackChartData
{
公共IReadOnlyCollection GetDetails(堆栈图表设置图表设置)
{
返回chartSetting.StackChartDataPoints.GroupBy(x=>new{x.DataTime.Month,x.RateId})
.OrderBy(x=>x.Key.RateId)。选择(cl=>newstackChartData(
cl.Key.RateId,
cl.Key.Month.ToString(CultureInfo.CurrentCulture),
cl.Sum(c=>Convert.ToDecimal(c.YData)),
chartSetting.GetColorCode(cl.Key.RateId)).ToList();
}
}
假设x.DataTime
是一个DateTime
,您的实现之间唯一不同的地方是您可能有一个int-Month
、int-Hour
或DateTime-Date
作为时间单位。您需要调用区域性敏感转换,这是接口的一部分,IConvertible
。因此,您可以使用Func
编写一个static
方法来选择这段数据:
internal static IReadOnlyCollection<StackChartData> GetDetails(StackChartSetting chartSetting, Func<DateTime, IConvertible> selector)
{
return chartSetting.StackChartDataPoints.GroupBy(x => new { TimeUnit=selector(x.DataTime), x.RateId })
.OrderBy(x => x.Key.RateId).Select(cl => new StackChartData(
cl.Key.RateId,
cl.Key.TimeUnit.ToString(CultureInfo.CurrentCulture),
cl.Sum(c => Convert.ToDecimal(c.YData)),
chartSetting.GetColorCode(cl.Key.RateId))).ToList();
}
内部静态IReadOnlyCollection GetDetails(StackChartSetting、chartSetting、Func选择器)
{
返回chartSetting.StackChartDataPoints.GroupBy(x=>new{TimeUnit=selector(x.DataTime),x.RateId})
.OrderBy(x=>x.Key.RateId)。选择(cl=>newstackChartData(
cl.Key.RateId,
cl.Key.TimeUnit.ToString(CultureInfo.CurrentCulture),
cl.Sum(c=>Convert.ToDecimal(c.YData)),
chartSetting.GetColorCode(cl.Key.RateId)).ToList();
}
然后调用变得很简单:
public class DailyStack : IStackChartData
{
public IReadOnlyCollection<StackChartData> GetDetails(StackChartSetting chartSetting)
{
return MyUtilities.GetDetails(chartSetting, x => x.Hour);
}
}
public class MonthlyStack : IStackChartData
{
public IReadOnlyCollection<StackChartData> GetDetails(StackChartSetting chartSetting)
{
return MyUtilities.GetDetails(chartSetting, x => x.Date);
}
}
public class YearlyStack : IStackChartData
{
public IReadOnlyCollection<StackChartData> GetDetails(StackChartSetting chartSetting)
{
return MyUtilities.GetDetails(chartSetting, x => x.Month);
}
}
公共类DailyStack:IStackChartData
{
公共IReadOnlyCollection GetDetails(堆栈图表设置图表设置)
{
返回MyUtilities.GetDetails(chartSetting,x=>x.Hour);
}
}
公共类MonthlyStack:IStackChartData
{
公共IReadOnlyCollection GetDetails(堆栈图表设置图表设置)
{
返回MyUtilities.GetDetails(chartSetting,x=>x.Date);
}
}
公共类YearyStack:IStackChartData
{
公共IReadOnlyCollection GetDetails(堆栈图表设置图表设置)
{
返回MyUtilities.GetDetails(chartSetting,x=>x.Month);
}
}