c# – 是否可以根据序列对LINQ元素进行分组?

我一直想知道;在我工作的公司,我们管理大量数据,但由于它是由客户有效地提供给我们的,我们并不一定信任它 – 有充分的理由.其中很多都有错误的时间戳,或者其中一些缺失,或者其他任何你有.

我最近必须完成的任务之一基本上是查找在一组元素中为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&lt分配所有变量; T&GT ;.它做的工作,但它看起来很讨厌.

因此,为了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 }

代码重复搜索列表中的空值(在它之前发现空值的情况下继续它的位置),计算彼此相邻的空值数,然后在空隙中分配第一个非空值.该代码假定每个间隙后总是存在非空值.

正如许多评论中所指出的,LINQ的使用在这里没有提供任何真正的优势.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...