2010-07-28 72 views
1

我有一个列表,我想计算一个包含每个轴承最大范围(到最近的程度)的double [360]。一个困难是我使用的海图绘制软件要求每个程度都没有漏洞。 我知道了MoreLinq批次扩展的,虽然不是很清楚如何使用它...如何将列表拆分为LINQ组并获得组中的最大值

继承人的代码,我到目前为止有: -

List<PolarCoords> plots = ...; 
double chartVals = new double[360]; // unused degrees will be zero 

double MaxRangesByDegree = from polar in plots let angle = RadToDeg(polar.Bearing) 
          group plot by angle into degreeBuckets 
          orderby degreeBuckets 
          select MaxRange = (from polar2 in degreeBuckets select polar2.SlantRange).Max().ToArray() 

// somehow merge chartVals and MaxRangesByDegree so no holes 

我可能试图咬掉对于单个查询来说太多了,并且可以通过一个简单的for循环来完成,但这对于学习LINQ来说是一个很好的练习:-)此刻代码抛出一个SystemException:至少有一个对象必须实现IComparable ...

回答

0
var plotsByDegree = plots.ToLookUp(polar => RadToDeg(polar.Bearing)); 

return Enumerable.Range(0,360) 
       . Select(degree => plotsByDegree.Contains(degree) ? plotsByDegree[degree].Max (polar => polar.SlantRange) : 0); 
+0

这真是太棒了:-)我现在不必担心MoreLinq扩展 - 我不会考虑使用ToLookup,虽然我知道Range(0,360),但我不确定如何将它与绘制数据。非常感谢:-) – 2010-08-09 10:08:04

+0

不用担心。只是猜测你的要求是什么,甚至不知道该选择什么样的明智默认,因为我不知道'SlantRange'的意思! – Ani 2010-08-09 10:58:30

0

你提到的例外是由于没有已知的方法来计算MaxSlantRange对象,因为SlantRange未执行IComparable<T>IComparable

+0

好了,所以我需要一个SlantRange双不是双的,或丢在SELECT语句里面:-)你知道,如果有任何方式使用批处理方式在查询表达式或做我必须将其转换为基于方法的查询? – 2010-07-29 09:00:31