我有一组数据集,我想在小组中进行汇总。对于每个组,我想创建一个足够大的数组来包含最大组的值。当一个组包含的最大数量少于此数量时,我想为空键值插入一个默认值零。
数据集
Col1 Col2 Value
--------------------
A X 10
A Z 15
B X 9
B Y 12
B Z 6
期望的结果
X, [10, 9]
Y, [0, 12]
Z, [15, 6]
请注意,数据集中Col1中的值“A”在Col2中没有“Y”的值。值“A”是外部序列中的第一个组,因此它是第一个缺少的元素。
以下查询创建结果数据集,但不插入Y组的默认零值。
result = data.GroupBy(item => item.Col2)
.Select(group => new
{
name = group.Key,
data = group.Select(item => item.Value)
.ToArray()
})
实际结果
X, [10, 9]
Y, [12]
Z, [15, 6]
如果要将零作为缺失的组值插入,我需要做什么?
答案 0 :(得分:3)
以下是我的理解方式。
假设我们有这个
class Data
{
public string Col1, Col2;
public decimal Value;
}
Data[] source =
{
new Data { Col1="A", Col2 = "X", Value = 10 },
new Data { Col1="A", Col2 = "Z", Value = 15 },
new Data { Col1="B", Col2 = "X", Value = 9 },
new Data { Col1="B", Col2 = "Y", Value = 12 },
new Data { Col1="B", Col2 = "Z", Value = 6 },
};
首先我们需要确定“固定”部分
var columns = source.Select(e => e.Col1).Distinct().OrderBy(c => c).ToList();
然后我们可以使用正常的分组进行处理,但在组内部,我们将左连接 columns
与组元素一起使我们能够实现所需的行为
var result = source.GroupBy(e => e.Col2, (key, elements) => new
{
Key = key,
Elements = (from c in columns
join e in elements on c equals e.Col1 into g
from e in g.DefaultIfEmpty()
select e != null ? e.Value : 0).ToList()
})
.OrderBy(e => e.Key)
.ToList();
答案 1 :(得分:2)
它不会很漂亮,但你可以这样做:
var groups = data.GroupBy(d => d.Col2, d => d.Value)
.Select(g => new { g, count = g.Count() })
.ToList();
int maxG = groups.Max(p => p.count);
var paddedGroups = groups.Select(p => new {
name = p.g.Key,
data = p.g.Concat(Enumerable.Repeat(0, maxG - p.count)).ToArray() });
答案 2 :(得分:1)
你可以这样做: -
int maxCount = 0;
var result = data.GroupBy(x => x.Col2)
.OrderByDescending(x => x.Count())
.Select(x =>
{
if (maxCount == 0)
maxCount = x.Count();
var Value = x.Select(z => z.Value);
return new
{
name = x.Key,
data = maxCount == x.Count() ? Value.ToArray() :
Value.Concat(new int[maxCount - Value.Count()]).ToArray()
};
});
代码说明: -
由于您需要附加default zeros
,以防任何组中的项目较少,我将存储maxCount(任何组可以在变量maxCount
中生成)为此我订购了项目按降序排列。接下来,我将存储项目可以在maxCount
变量中生成的最大计数。在投影时,我只是检查组中的项目数是否不等于maxCount
,然后创建一个integer array
大小(maxCount - x.Count),即最大数量减去当前组中的项目数量将它附加到数组中。