【发布时间】:2020-07-25 23:07:35
【问题描述】:
我们有一个 API 可以处理来自不同来源(数据库、Web 服务、纯文本等)的数据,因此我们将其存储在 List 结构中。 我们有这段代码来选择其中的一些列并应用函数来获取新数据(将两列相加,...)
Func<dynamic[], object>[] leftFunctions = new Func<dynamic[], object>[this.Columns.Count];
IEnumerable<dynamic[]> returnValue = null
j = 0;
foreach (JoinDataColumn dataColum in this.Columns.OrderBy(x => x.Index))
{
//Obtenemos para cada columna la funcion
leftFunctions[j++] = dataColum.getLeftFunction(LeftDataQuery);
}
returnValue = (await LeftDataQuery.ExecuteAsync(parameters))
.Select(x => leftFunctions.Select(f => f.Invoke(x)).ToArray());
在上面的代码中:LeftDataquery 是一个类,用于获取执行此操作的数据列表,并返回List<object[]>
await LeftDataQuery.ExecuteAsync(parameters)
LeftFuncions 是从源数据创建新数据的公式,“lefdataquery[1]+lefdataquery[2]”或简单地“lefdataquery[0]”来获取第一列的数据。
在 JoinDataColumn 类中,我对结果列表的每一列都有描述:名称、类型和聚合函数。
最后,用户可以选择要分组的列和其他列的聚合公式(sum、max、min、count distinct,...)。所以现在我有了返回值,其中包含原始源的列的子集和包含要分组的列的索引列表以及带有聚合公式的索引列表(例如,索引 1 是 SUM 等等)
public enum DataColumnAggregation { NONE = 0, SUM = 1, MAX = 2, MIN = 3 }
关于如何按此数据分组并获得 SUM/MAX/MIN 的任何想法,..
做一些测试我已经写了这段代码,但问题是 Groupby 不能使用对象数组作为参数。让 GroupBy 使用这种方法有什么想法吗?¿
public enum DataColumnAggregation { NONE = 0, SUM = 1, MAX = 2, MIN = 3 }
static void Main(string[] args)
{
List<object[]> returnValue = new List<object[]> { new object[] { "C1", 1, 2 }, new object[] { "C2", 3, 4 }, new object[] { "C1", 1, 3 } };
DataColumnAggregation[] config = new DataColumnAggregation[] { DataColumnAggregation.NONE, DataColumnAggregation.SUM, DataColumnAggregation.MAX };
//TODO agregar por la columna 0 , sumar la columna 1 y maximo de la columna 2 de returnvalue
var resultado2 = returnValue.GroupBy(x => getGroupByColumns(x,config)).Select(x=>agregar(x, config));
}
private static object[] agregar(IGrouping<string[], object[]> x, DataColumnAggregation[] config)
{
List<object> result = new List<object>();
for (int i = 0; i < config.Length; i++)
{
if (config[i] == DataColumnAggregation.NONE)
{
result.Add(x.Select(xy => xy[i]).FirstOrDefault());
}
if (config[i] == DataColumnAggregation.SUM)
{
result.Add(x.Sum(xy => Convert.ToInt32(xy[i])));
}
if (config[i] == DataColumnAggregation.MAX)
{
result.Add(x.Max(xy => xy[i]));
}
if (config[i] == DataColumnAggregation.MIN)
{
result.Add(x.Min(xy => xy[i]));
}
}
return result.ToArray();
}
private static string[] getGroupByColumns(object[] x, DataColumnAggregation[] config)
{
List<string> group = new List<string>();
for (int i = 0; i< config.Length; i++)
{
if (config[i] == DataColumnAggregation.NONE) group.Add(x[i].ToString());
}
return group.ToArray();
}
谢谢
【问题讨论】:
-
我认为您遗漏了很多细节。您要查询的
List在哪里?getLeftFunction返回什么?LeftDataQuery是什么?按列分组的参数和聚合公式在哪里? “索引列表”是什么意思? -
已编辑。索引列表,是一个数组,结果列表中对应索引的聚合公式
-
您能否提供这些列表的 C# 数据类型?