WEB开发网
开发学院软件开发C语言 浅谈分组统计 阅读

浅谈分组统计

 2009-06-14 08:33:35 来源:WEB开发网   
核心提示: 这种方法有个最大的缺点就是在 foreach 循环结束之后还要进行一次统计,闻到了代码的“坏味道”,浅谈分组统计(2),那么,就让我们来重构吧,就要先对输入数据进行一次排序,最后,这次,使用迭代器进行循环:IEnumerable<Tuple<int,in

这种方法有个最大的缺点就是在 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;
}

上一页  1 2 3 4  下一页

Tags:分组 统计

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接