具有通用 foreach 的通用方法
Generic Method with Generic foreach
我有 2 种几乎相同但差别不大的方法,我想制作 1 种通用方法来完成这一切。
方法一
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data)
{
List<DataGraficoNgxChart> series = new List<DataGraficoNgxChart> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Clasificacion))
{
var sub = series.Find(s => s.Name == item.Clasificacion);
Series serie = new Series { Value = item.Monto, Name = item.Fecha };
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart evolucionPatrimonio = new DataGraficoNgxChart
{
Name = item.Clasificacion,
Series = new List<Series> { new Series { Value = item.Monto, Name = item.Fecha } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
方法二
public List<DataGraficoNgxChartInvertida> GenerarDataGraficoNgxChart(List<Rentabilidad> data)
{
List<DataGraficoNgxChartInvertida> series = new List<DataGraficoNgxChartInvertida> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Fecha))
{
var sub = series.Find(s => s.Name == item.Fecha);
SeriesInvertidaserie = new SeriesInvertida{ Value = item.Monto, Name = item.Clasificacion};
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChartInvertidaevolucionPatrimonio = new DataGraficoNgxChartInvertida
{
Name = item.Fecha,
SeriesInvertida= new List<SeriesInvertida> { new Series { Value = item.Monto, Name = item.Clasificacion } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
我的 class 是:
private class DataGraficoNgxChart
{
public string Name { get; set; }
public List<Series> Series { get; set; }
}
private class DataGraficoNgxChartInvertida
{
public DateTime Name { get; set; }
public List<SeriesInvertida> Series { get; set; }
}
private class Series
{
public decimal? Value { get; set; }
public DateTime Name { get; set; }
}
private class SeriesInvertida
{
public decimal? Value { get; set; }
public string Name { get; set; }
}
到目前为止,我设法使类成为通用类:
public class DataGraficoNgxChart<N, T>
{
public N Name { get; set; }
public List<Series<T>> Series { get; set; }
}
public class Series<T>
{
public decimal? Value { get; set; }
public T Name { get; set; }
}
但我在使用通用方法时遇到困难:
public List<DataGraficoNgxChart<N, T>> GenerarDataGraficoNgxChart<X, N, T>(List<X> data, Predicate<X> ejexName, b ejey ) // Trying to pass the parameters, but might be wrong
{
List<DataGraficoNgxChart<N, T>> series = new List<DataGraficoNgxChart<N, T>> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Clasificacion)) // item properties gives me error (obviously, it doesn't have a way to know them)
{
var sub = series.Find(s => s.Name == item.Clasificacion); // Other error here
Series<T> serie = new Series<T> { Value = item.Monto, Name = item.Fecha }; // And here
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart<N, T> evolucionPatrimonio = new DataGraficoNgxChart<N, T>
{
Name = item.Clasificacion, // And here again
Series = new List<Series<T>> { new Series<T> { Value = item.Monto, Name = item.Fecha } } // And and again...
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
代码错误(它是一个 WIP),但我不知道如何调用 for each 中的通用对象属性。
到目前为止,这是我的 完整 class 旧方法和通用方法。
using System;
using System.Collections.Generic;
using System.Linq;
namespace GpiWebApp.Services
{
public interface INgxChartSpecification
{
List<DataGraficoNgxChart<N, T>> GenerarDataGraficoNgxChart<X, N, T>(List<X> data, Predicate<X> ejexName, b ejey);
List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<RentabilidadClasificacion> data);
List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data);
List<DataGraficoNgxChartInvertida> GenerarDataGraficoInvertidoNgxChart(List<EvolucionCartera> data);
}
public sealed class NgxChartSpecification : INgxChartSpecification
{
public NgxChartSpecification()
{
}
public List<DataGraficoNgxChart<N, T>> GenerarDataGraficoNgxChart<X, N, T>(List<X> data, Predicate<X> ejexName, b ejey) // Trying to pass the parameters, but might be wrong
{
List<DataGraficoNgxChart<N, T>> series = new List<DataGraficoNgxChart<N, T>> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Clasificacion)) // item properties gives me error (obviously, it doesn't have a way to know them)
{
var sub = series.Find(s => s.Name == item.Clasificacion); // Other error here
Series<T> serie = new Series<T> { Value = item.Monto, Name = item.Fecha }; // And here
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart<N, T> evolucionPatrimonio = new DataGraficoNgxChart<N, T>
{
Name = item.Clasificacion, // And here again
Series = new List<Series<T>> { new Series<T> { Value = item.Monto, Name = item.Fecha } } // And and again...
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<RentabilidadClasificacion> data)
{
List<DataGraficoNgxChart> series = new List<DataGraficoNgxChart> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.dscArbol))
{
var sub = series.Find(s => s.Name == item.dscArbol);
Series serie = new Series { Value = item.ValorCuota, Name = item.FechaCierre };
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart evolucionPatrimonio = new DataGraficoNgxChart
{
Name = item.dscArbol,
Series = new List<Series> { new Series { Value = item.ValorCuota, Name = item.FechaCierre } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data)
{
List<DataGraficoNgxChart> series = new List<DataGraficoNgxChart> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Clasificacion))
{
var sub = series.Find(s => s.Name == item.Clasificacion);
Series serie = new Series { Value = item.Monto, Name = item.Fecha };
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart evolucionPatrimonio = new DataGraficoNgxChart
{
Name = item.Clasificacion,
Series = new List<Series> { new Series { Value = item.Monto, Name = item.Fecha } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
public List<DataGraficoNgxChartInvertida> GenerarDataGraficoInvertidoNgxChart(List<EvolucionCartera> data)
{
List<DataGraficoNgxChartInvertida> series = new List<DataGraficoNgxChartInvertida> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Fecha))
{
var sub = series.Find(s => s.Name == item.Fecha);
SeriesInvertida serie = new SeriesInvertida { Value = item.Monto, Name = item.Clasificacion };
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChartInvertida evolucionPatrimonio = new DataGraficoNgxChartInvertida
{
Name = item.Fecha,
Series = new List<SeriesInvertida> { new SeriesInvertida { Value = item.Monto, Name = item.Clasificacion } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
}
public class DataGraficoNgxChart<N, T>
{
public N Name { get; set; }
public List<Series<T>> Series { get; set; }
}
public class Series<T>
{
public decimal? Value { get; set; }
public T Name { get; set; }
}
public class DataGraficoNgxChart
{
public string Name { get; set; }
public List<Series> Series { get; set; }
}
public class Series
{
public decimal? Value { get; set; }
public DateTime Name { get; set; }
}
public class DataGraficoNgxChartInvertida
{
public DateTime Name { get; set; }
public List<SeriesInvertida> Series { get; set; }
}
public class SeriesInvertida
{
public decimal? Value { get; set; }
public string Name { get; set; }
}
public class RentabilidadClasificacion
{
public DateTime FechaCierre { get; set; }
public decimal IdArbol { get; set; }
public string dscArbol { get; set; }
public decimal Patrimonio { get; set; }
public decimal Aporet { get; set; }
public decimal Utilidad { get; set; }
public decimal Rentabilidad { get; set; }
public decimal ValorCuota { get; set; }
public decimal Distribucion { get; set; }
public decimal Nivel { get; set; }
}
public class EvolucionCartera
{
public DateTime Fecha { get; set; }
public string Clasificacion { get; set; }
public decimal? Monto { get; set; }
public decimal NivelArbol { get; set; }
}
}
有什么帮助建议吗?
更新代码示例后,您就可以做到这一点。
创建通用接口:
public interface IItem
{
string Lookupname { get; }
DateTime Name { get; }
decimal? Value { get; }
}
创建一个带有 where
约束的新方法 GenerarDataGraficoNgxChart 并让它使用 IItem
属性而不是 RentabilidadClasificacion
/EvolucionCartera
:
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart<T>(List<T> data)
where T : IItem // added
{
List<DataGraficoNgxChart> series = new List<DataGraficoNgxChart> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Lookupname)) // changed
{
var sub = series.Find(s => s.Name == item.Lookupname); // changed
Series serie = new Series { Value = item.Value, Name = item.Name }; // changed
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart evolucionPatrimonio = new DataGraficoNgxChart
{
Name = item.Lookupname, // changed
Series = new List<Series> { new Series { Value = item.Value, Name = item.Name } } // changed
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
当然,让RentabilidadClasificacion
和EvolucionCartera
实现接口。我这里选择的是explicit interface implementation:
public class RentabilidadClasificacion : NgxChartSpecification.IItem
{
public DateTime FechaCierre { get; set; }
public decimal IdArbol { get; set; }
public string dscArbol { get; set; }
public decimal Patrimonio { get; set; }
public decimal Aporet { get; set; }
public decimal Utilidad { get; set; }
public decimal Rentabilidad { get; set; }
public decimal ValorCuota { get; set; }
public decimal Distribucion { get; set; }
public decimal Nivel { get; set; }
#region Implementation of IItem
string NgxChartSpecification.IItem.Lookupname => dscArbol;
DateTime NgxChartSpecification.IItem.Name => FechaCierre;
decimal? NgxChartSpecification.IItem.Value => ValorCuota;
#endregion
}
public class EvolucionCartera : NgxChartSpecification.IItem
{
public DateTime Fecha { get; set; }
public string Clasificacion { get; set; }
public decimal? Monto { get; set; }
public decimal NivelArbol { get; set; }
#region Implementation of IItem
DateTime NgxChartSpecification.IItem.Name => Fecha;
decimal? NgxChartSpecification.IItem.Value => Monto;
string NgxChartSpecification.IItem.Lookupname => Clasificacion;
#endregion
}
现在您可以创建:
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data)
{
return GenerarDataGraficoNgxChart<EvolucionCartera>(data);
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<RentabilidadClasificacion> data)
{
return GenerarDataGraficoNgxChart<RentabilidadClasificacion>(data);
}
全部类,这样编译!
using System;
using System.Collections.Generic;
using System.Linq;
namespace GpiWebApp.Services
{
public interface INgxChartSpecification
{
List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<RentabilidadClasificacion> data);
List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data);
List<DataGraficoNgxChartInvertida> GenerarDataGraficoInvertidoNgxChart(List<EvolucionCartera> data);
}
public sealed class NgxChartSpecification : INgxChartSpecification
{
public NgxChartSpecification()
{
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data)
{
return GenerarDataGraficoNgxChart<EvolucionCartera>(data);
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<RentabilidadClasificacion> data)
{
return GenerarDataGraficoNgxChart<RentabilidadClasificacion>(data);
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart<T>(List<T> data)
where T : IItem // added
{
List<DataGraficoNgxChart> series = new List<DataGraficoNgxChart> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Lookupname)) // changed
{
var sub = series.Find(s => s.Name == item.Lookupname); // changed
Series serie = new Series { Value = item.Value, Name = item.Name }; // changed
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart evolucionPatrimonio = new DataGraficoNgxChart
{
Name = item.Lookupname, // changed
Series = new List<Series> { new Series { Value = item.Value, Name = item.Name } } // changed
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
public interface IItem
{
string Lookupname { get; }
DateTime Name { get; }
decimal? Value { get; }
}
public List<DataGraficoNgxChartInvertida> GenerarDataGraficoInvertidoNgxChart(List<EvolucionCartera> data)
{
List<DataGraficoNgxChartInvertida> series = new List<DataGraficoNgxChartInvertida> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Fecha))
{
var sub = series.Find(s => s.Name == item.Fecha);
SeriesInvertida serie = new SeriesInvertida { Value = item.Monto, Name = item.Clasificacion };
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChartInvertida evolucionPatrimonio = new DataGraficoNgxChartInvertida
{
Name = item.Fecha,
Series = new List<SeriesInvertida> { new SeriesInvertida { Value = item.Monto, Name = item.Clasificacion } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
}
public class DataGraficoNgxChart<N, T>
{
public N Name { get; set; }
public List<Series<T>> Series { get; set; }
}
public class Series<T>
{
public decimal? Value { get; set; }
public T Name { get; set; }
}
public class DataGraficoNgxChart
{
public string Name { get; set; }
public List<Series> Series { get; set; }
}
public class Series
{
public decimal? Value { get; set; }
public DateTime Name { get; set; }
}
public class DataGraficoNgxChartInvertida
{
public DateTime Name { get; set; }
public List<SeriesInvertida> Series { get; set; }
}
public class SeriesInvertida
{
public decimal? Value { get; set; }
public string Name { get; set; }
}
public class RentabilidadClasificacion : NgxChartSpecification.IItem
{
public DateTime FechaCierre { get; set; }
public decimal IdArbol { get; set; }
public string dscArbol { get; set; }
public decimal Patrimonio { get; set; }
public decimal Aporet { get; set; }
public decimal Utilidad { get; set; }
public decimal Rentabilidad { get; set; }
public decimal ValorCuota { get; set; }
public decimal Distribucion { get; set; }
public decimal Nivel { get; set; }
#region Implementation of IItem
string NgxChartSpecification.IItem.Lookupname => dscArbol;
DateTime NgxChartSpecification.IItem.Name => FechaCierre;
decimal? NgxChartSpecification.IItem.Value => ValorCuota;
#endregion
}
public class EvolucionCartera : NgxChartSpecification.IItem
{
public DateTime Fecha { get; set; }
public string Clasificacion { get; set; }
public decimal? Monto { get; set; }
public decimal NivelArbol { get; set; }
#region Implementation of IItem
DateTime NgxChartSpecification.IItem.Name => Fecha;
decimal? NgxChartSpecification.IItem.Value => Monto;
string NgxChartSpecification.IItem.Lookupname => Clasificacion;
#endregion
}
}
我有 2 种几乎相同但差别不大的方法,我想制作 1 种通用方法来完成这一切。
方法一
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data)
{
List<DataGraficoNgxChart> series = new List<DataGraficoNgxChart> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Clasificacion))
{
var sub = series.Find(s => s.Name == item.Clasificacion);
Series serie = new Series { Value = item.Monto, Name = item.Fecha };
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart evolucionPatrimonio = new DataGraficoNgxChart
{
Name = item.Clasificacion,
Series = new List<Series> { new Series { Value = item.Monto, Name = item.Fecha } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
方法二
public List<DataGraficoNgxChartInvertida> GenerarDataGraficoNgxChart(List<Rentabilidad> data)
{
List<DataGraficoNgxChartInvertida> series = new List<DataGraficoNgxChartInvertida> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Fecha))
{
var sub = series.Find(s => s.Name == item.Fecha);
SeriesInvertidaserie = new SeriesInvertida{ Value = item.Monto, Name = item.Clasificacion};
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChartInvertidaevolucionPatrimonio = new DataGraficoNgxChartInvertida
{
Name = item.Fecha,
SeriesInvertida= new List<SeriesInvertida> { new Series { Value = item.Monto, Name = item.Clasificacion } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
我的 class 是:
private class DataGraficoNgxChart
{
public string Name { get; set; }
public List<Series> Series { get; set; }
}
private class DataGraficoNgxChartInvertida
{
public DateTime Name { get; set; }
public List<SeriesInvertida> Series { get; set; }
}
private class Series
{
public decimal? Value { get; set; }
public DateTime Name { get; set; }
}
private class SeriesInvertida
{
public decimal? Value { get; set; }
public string Name { get; set; }
}
到目前为止,我设法使类成为通用类:
public class DataGraficoNgxChart<N, T>
{
public N Name { get; set; }
public List<Series<T>> Series { get; set; }
}
public class Series<T>
{
public decimal? Value { get; set; }
public T Name { get; set; }
}
但我在使用通用方法时遇到困难:
public List<DataGraficoNgxChart<N, T>> GenerarDataGraficoNgxChart<X, N, T>(List<X> data, Predicate<X> ejexName, b ejey ) // Trying to pass the parameters, but might be wrong
{
List<DataGraficoNgxChart<N, T>> series = new List<DataGraficoNgxChart<N, T>> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Clasificacion)) // item properties gives me error (obviously, it doesn't have a way to know them)
{
var sub = series.Find(s => s.Name == item.Clasificacion); // Other error here
Series<T> serie = new Series<T> { Value = item.Monto, Name = item.Fecha }; // And here
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart<N, T> evolucionPatrimonio = new DataGraficoNgxChart<N, T>
{
Name = item.Clasificacion, // And here again
Series = new List<Series<T>> { new Series<T> { Value = item.Monto, Name = item.Fecha } } // And and again...
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
代码错误(它是一个 WIP),但我不知道如何调用 for each 中的通用对象属性。
到目前为止,这是我的 完整 class 旧方法和通用方法。
using System;
using System.Collections.Generic;
using System.Linq;
namespace GpiWebApp.Services
{
public interface INgxChartSpecification
{
List<DataGraficoNgxChart<N, T>> GenerarDataGraficoNgxChart<X, N, T>(List<X> data, Predicate<X> ejexName, b ejey);
List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<RentabilidadClasificacion> data);
List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data);
List<DataGraficoNgxChartInvertida> GenerarDataGraficoInvertidoNgxChart(List<EvolucionCartera> data);
}
public sealed class NgxChartSpecification : INgxChartSpecification
{
public NgxChartSpecification()
{
}
public List<DataGraficoNgxChart<N, T>> GenerarDataGraficoNgxChart<X, N, T>(List<X> data, Predicate<X> ejexName, b ejey) // Trying to pass the parameters, but might be wrong
{
List<DataGraficoNgxChart<N, T>> series = new List<DataGraficoNgxChart<N, T>> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Clasificacion)) // item properties gives me error (obviously, it doesn't have a way to know them)
{
var sub = series.Find(s => s.Name == item.Clasificacion); // Other error here
Series<T> serie = new Series<T> { Value = item.Monto, Name = item.Fecha }; // And here
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart<N, T> evolucionPatrimonio = new DataGraficoNgxChart<N, T>
{
Name = item.Clasificacion, // And here again
Series = new List<Series<T>> { new Series<T> { Value = item.Monto, Name = item.Fecha } } // And and again...
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<RentabilidadClasificacion> data)
{
List<DataGraficoNgxChart> series = new List<DataGraficoNgxChart> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.dscArbol))
{
var sub = series.Find(s => s.Name == item.dscArbol);
Series serie = new Series { Value = item.ValorCuota, Name = item.FechaCierre };
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart evolucionPatrimonio = new DataGraficoNgxChart
{
Name = item.dscArbol,
Series = new List<Series> { new Series { Value = item.ValorCuota, Name = item.FechaCierre } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data)
{
List<DataGraficoNgxChart> series = new List<DataGraficoNgxChart> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Clasificacion))
{
var sub = series.Find(s => s.Name == item.Clasificacion);
Series serie = new Series { Value = item.Monto, Name = item.Fecha };
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart evolucionPatrimonio = new DataGraficoNgxChart
{
Name = item.Clasificacion,
Series = new List<Series> { new Series { Value = item.Monto, Name = item.Fecha } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
public List<DataGraficoNgxChartInvertida> GenerarDataGraficoInvertidoNgxChart(List<EvolucionCartera> data)
{
List<DataGraficoNgxChartInvertida> series = new List<DataGraficoNgxChartInvertida> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Fecha))
{
var sub = series.Find(s => s.Name == item.Fecha);
SeriesInvertida serie = new SeriesInvertida { Value = item.Monto, Name = item.Clasificacion };
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChartInvertida evolucionPatrimonio = new DataGraficoNgxChartInvertida
{
Name = item.Fecha,
Series = new List<SeriesInvertida> { new SeriesInvertida { Value = item.Monto, Name = item.Clasificacion } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
}
public class DataGraficoNgxChart<N, T>
{
public N Name { get; set; }
public List<Series<T>> Series { get; set; }
}
public class Series<T>
{
public decimal? Value { get; set; }
public T Name { get; set; }
}
public class DataGraficoNgxChart
{
public string Name { get; set; }
public List<Series> Series { get; set; }
}
public class Series
{
public decimal? Value { get; set; }
public DateTime Name { get; set; }
}
public class DataGraficoNgxChartInvertida
{
public DateTime Name { get; set; }
public List<SeriesInvertida> Series { get; set; }
}
public class SeriesInvertida
{
public decimal? Value { get; set; }
public string Name { get; set; }
}
public class RentabilidadClasificacion
{
public DateTime FechaCierre { get; set; }
public decimal IdArbol { get; set; }
public string dscArbol { get; set; }
public decimal Patrimonio { get; set; }
public decimal Aporet { get; set; }
public decimal Utilidad { get; set; }
public decimal Rentabilidad { get; set; }
public decimal ValorCuota { get; set; }
public decimal Distribucion { get; set; }
public decimal Nivel { get; set; }
}
public class EvolucionCartera
{
public DateTime Fecha { get; set; }
public string Clasificacion { get; set; }
public decimal? Monto { get; set; }
public decimal NivelArbol { get; set; }
}
}
有什么帮助建议吗?
更新代码示例后,您就可以做到这一点。
创建通用接口:
public interface IItem
{
string Lookupname { get; }
DateTime Name { get; }
decimal? Value { get; }
}
创建一个带有 where
约束的新方法 GenerarDataGraficoNgxChart 并让它使用 IItem
属性而不是 RentabilidadClasificacion
/EvolucionCartera
:
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart<T>(List<T> data)
where T : IItem // added
{
List<DataGraficoNgxChart> series = new List<DataGraficoNgxChart> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Lookupname)) // changed
{
var sub = series.Find(s => s.Name == item.Lookupname); // changed
Series serie = new Series { Value = item.Value, Name = item.Name }; // changed
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart evolucionPatrimonio = new DataGraficoNgxChart
{
Name = item.Lookupname, // changed
Series = new List<Series> { new Series { Value = item.Value, Name = item.Name } } // changed
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
当然,让RentabilidadClasificacion
和EvolucionCartera
实现接口。我这里选择的是explicit interface implementation:
public class RentabilidadClasificacion : NgxChartSpecification.IItem
{
public DateTime FechaCierre { get; set; }
public decimal IdArbol { get; set; }
public string dscArbol { get; set; }
public decimal Patrimonio { get; set; }
public decimal Aporet { get; set; }
public decimal Utilidad { get; set; }
public decimal Rentabilidad { get; set; }
public decimal ValorCuota { get; set; }
public decimal Distribucion { get; set; }
public decimal Nivel { get; set; }
#region Implementation of IItem
string NgxChartSpecification.IItem.Lookupname => dscArbol;
DateTime NgxChartSpecification.IItem.Name => FechaCierre;
decimal? NgxChartSpecification.IItem.Value => ValorCuota;
#endregion
}
public class EvolucionCartera : NgxChartSpecification.IItem
{
public DateTime Fecha { get; set; }
public string Clasificacion { get; set; }
public decimal? Monto { get; set; }
public decimal NivelArbol { get; set; }
#region Implementation of IItem
DateTime NgxChartSpecification.IItem.Name => Fecha;
decimal? NgxChartSpecification.IItem.Value => Monto;
string NgxChartSpecification.IItem.Lookupname => Clasificacion;
#endregion
}
现在您可以创建:
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data)
{
return GenerarDataGraficoNgxChart<EvolucionCartera>(data);
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<RentabilidadClasificacion> data)
{
return GenerarDataGraficoNgxChart<RentabilidadClasificacion>(data);
}
全部类,这样编译!
using System;
using System.Collections.Generic;
using System.Linq;
namespace GpiWebApp.Services
{
public interface INgxChartSpecification
{
List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<RentabilidadClasificacion> data);
List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data);
List<DataGraficoNgxChartInvertida> GenerarDataGraficoInvertidoNgxChart(List<EvolucionCartera> data);
}
public sealed class NgxChartSpecification : INgxChartSpecification
{
public NgxChartSpecification()
{
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<EvolucionCartera> data)
{
return GenerarDataGraficoNgxChart<EvolucionCartera>(data);
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart(List<RentabilidadClasificacion> data)
{
return GenerarDataGraficoNgxChart<RentabilidadClasificacion>(data);
}
public List<DataGraficoNgxChart> GenerarDataGraficoNgxChart<T>(List<T> data)
where T : IItem // added
{
List<DataGraficoNgxChart> series = new List<DataGraficoNgxChart> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Lookupname)) // changed
{
var sub = series.Find(s => s.Name == item.Lookupname); // changed
Series serie = new Series { Value = item.Value, Name = item.Name }; // changed
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChart evolucionPatrimonio = new DataGraficoNgxChart
{
Name = item.Lookupname, // changed
Series = new List<Series> { new Series { Value = item.Value, Name = item.Name } } // changed
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
public interface IItem
{
string Lookupname { get; }
DateTime Name { get; }
decimal? Value { get; }
}
public List<DataGraficoNgxChartInvertida> GenerarDataGraficoInvertidoNgxChart(List<EvolucionCartera> data)
{
List<DataGraficoNgxChartInvertida> series = new List<DataGraficoNgxChartInvertida> { };
foreach (var item in data)
{
if (series.Exists(s => s.Name == item.Fecha))
{
var sub = series.Find(s => s.Name == item.Fecha);
SeriesInvertida serie = new SeriesInvertida { Value = item.Monto, Name = item.Clasificacion };
sub.Series.Add(serie);
}
else
{
DataGraficoNgxChartInvertida evolucionPatrimonio = new DataGraficoNgxChartInvertida
{
Name = item.Fecha,
Series = new List<SeriesInvertida> { new SeriesInvertida { Value = item.Monto, Name = item.Clasificacion } }
};
series.Add(evolucionPatrimonio);
}
}
return series.OrderBy(s => s.Name).ToList();
}
}
public class DataGraficoNgxChart<N, T>
{
public N Name { get; set; }
public List<Series<T>> Series { get; set; }
}
public class Series<T>
{
public decimal? Value { get; set; }
public T Name { get; set; }
}
public class DataGraficoNgxChart
{
public string Name { get; set; }
public List<Series> Series { get; set; }
}
public class Series
{
public decimal? Value { get; set; }
public DateTime Name { get; set; }
}
public class DataGraficoNgxChartInvertida
{
public DateTime Name { get; set; }
public List<SeriesInvertida> Series { get; set; }
}
public class SeriesInvertida
{
public decimal? Value { get; set; }
public string Name { get; set; }
}
public class RentabilidadClasificacion : NgxChartSpecification.IItem
{
public DateTime FechaCierre { get; set; }
public decimal IdArbol { get; set; }
public string dscArbol { get; set; }
public decimal Patrimonio { get; set; }
public decimal Aporet { get; set; }
public decimal Utilidad { get; set; }
public decimal Rentabilidad { get; set; }
public decimal ValorCuota { get; set; }
public decimal Distribucion { get; set; }
public decimal Nivel { get; set; }
#region Implementation of IItem
string NgxChartSpecification.IItem.Lookupname => dscArbol;
DateTime NgxChartSpecification.IItem.Name => FechaCierre;
decimal? NgxChartSpecification.IItem.Value => ValorCuota;
#endregion
}
public class EvolucionCartera : NgxChartSpecification.IItem
{
public DateTime Fecha { get; set; }
public string Clasificacion { get; set; }
public decimal? Monto { get; set; }
public decimal NivelArbol { get; set; }
#region Implementation of IItem
DateTime NgxChartSpecification.IItem.Name => Fecha;
decimal? NgxChartSpecification.IItem.Value => Monto;
string NgxChartSpecification.IItem.Lookupname => Clasificacion;
#endregion
}
}