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