浅谈分组统计
2009-06-14 08:33:35 来源:WEB开发网这种方法有个最大的缺点就是在 foreach 循环结束之后还要进行一次统计,闻到了代码的“坏味道”。
那么,就让我们来重构吧,这次,使用迭代器进行循环:
IEnumerable<Tuple<int, int, double>> Iterate(IEnumerable<Tuple<int, double>> tuples)
{
var result = new List<Tuple<int, int, double>>();
var count = 0;
var sum = 0.0;
int? key = null;
for (var iter = tuples.GetEnumerator(); ; count++, sum += iter.Current.Item2)
{
var hasValue = iter.MoveNext();
if (!hasValue || key != iter.Current.Item1)
{
if (key != null) result.Add(new Tuple<int, int, double>(key.Value, count, sum / count));
if (!hasValue) break;
sum = count = 0;
key = iter.Current.Item1;
}
}
return result;
}
这样,就消灭了“坏味道”。
注意,以上两种方法都假设输入数据已经排好序。如若不然,就要先对输入数据进行一次排序。
最后,如果使用 Linq 的话,还可以更简单:
IEnumerable<Tuple<int, int, double>> Linq(IEnumerable<Tuple<int, double>> tuples)
{
var result = new List<Tuple<int, int, double>>();
var q = from k in tuples group k by k.Item1;
foreach (var g in q) result.Add(new Tuple<int, int, double>(g.Key, g.Count(), g.Average(v => v.Item2)));
return result;
}
更多精彩
赞助商链接