我一直想知道;在我工作的公司,我们管理大量数据,但由于它是由客户有效地提供给我们的,我们并不一定信任它 – 有充分的理由.其中很多都有错误的时间戳,或者其中一些缺失,或者其他任何你有.
我最近必须完成的任务之一基本上是查找在一组元素中为null的元素,然后找到下一个非null元素,然后平均这些空记录之间的差异.也就是说,我们有数据集A:
A = { 0f,1f,2f,5f,Null,7f,8f }
重要的是要注意我们必须区分0和Null.显然差异是0是0,而Null根本就没有数据.
使用LINQ,我们可以基本上访问A的以下小节:
Subsection { Null,7f }
并将它放在一个集合中,以便我们可以将它转换为(7 / 4f)四个记录.
Subsection { 1.75f,1.75f,1.75f }
这样当再次迭代A时,我们得到以下输出:
{ 0f,4f,4f }
目前我这样做的方法是使用数字for进行传递,查找null元素,然后将所有连续的空值存储在List< T>中,并在找到下一个非null后,通过遍历所述List<分配所有变量; T> ;.它做的工作,但它看起来很讨厌.
因此,为了narcicissim,有没有一种方法可以做到这一点(=更少的代码混乱)?
伪
a = { 0,1,2,5,null,7,0 } nullList = new List() for i = 0,a.length if i == null nullList.add(i) else if nullList.length > 0 nullList.add(i) int avg = nullList.Aggregate(x => x) foreach element in nullList element = avg nullList.clear()
解决方法
如果我正确理解您的问题,您希望使用基于第一个非null值的值替换列表中的空值.我不明白为什么你需要第二个空值列表.这是尝试只是就地修改列表,虽然它没有你已经拥有的那么短:
var A = new List<float?> { 0f,8f }; for (int i = A.IndexOf(null); i != -1; i = A.IndexOf(null,i)) { int j = 0; do { j++; } while (A[i + j] == null); float f = A[i + j].Value / (j + 1); do { A[i++] = f; } while (j --> 0); } // A == { 0f,4f }
代码重复搜索列表中的空值(在它之前发现空值的情况下继续它的位置),计算彼此相邻的空值数,然后在空隙中分配第一个非空值.该代码假定每个间隙后总是存在非空值.