Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 小计,而不是组,使用LINQ?_.net_Vb.net_Linq - Fatal编程技术网

.net 小计,而不是组,使用LINQ?

.net 小计,而不是组,使用LINQ?,.net,vb.net,linq,.net,Vb.net,Linq,我的目标是:我有一个1 GB的csv文件,我正试图总结。假设文件中有“fields/”列A-M。我希望某些字段在另一个字段(例如A)上进行小计。我希望的结果是字段A中的每个值以及其他三个字段(例如B、G和L)的小计 问题是:我试图用LINQ查询来处理这个问题,但是会抛出内存不足异常 我的问题是: Dim summarizedRecs = From line In System.IO.File.ReadLines(filepath) Skip 1 Let e = New

我的目标是:我有一个1 GB的csv文件,我正试图总结。假设文件中有“fields/”列A-M。我希望某些字段在另一个字段(例如A)上进行小计。我希望的结果是字段A中的每个值以及其他三个字段(例如B、G和L)的小计

问题是:我试图用LINQ查询来处理这个问题,但是会抛出内存不足异常

我的问题是:

Dim summarizedRecs = From line In System.IO.File.ReadLines(filepath)
       Skip 1
       Let e = New aRecord(line)
       Group e
       By e.A
       Into g = Group
       Select summarizedR = New With {
           A,
           .TotalB = g.Sum(Function(x) x.B),
           .TotalG = g.Sum(Function(x) x.G),
           .TotalL = g.Sum(Function(x) x.L)}
       Order By summarizedR.A
aRecord
是一个简单的类,它的构造函数获取一行文本并将该行解析为适当的字段。那很好

这种方法适用于较小的文件(约100 MB)。对于100 MB文件和1 GB文件,应用程序使用的内存在运行时会增加

我怀疑LINQ小组不是我想要的,但我不确定是否还有其他LINQ方法。有吗

我认为LINQ将我所有的e实例都保存在了组中。最后,我不需要e组。将每个e的字段添加到适当的组后,可以处理该e。我只想得到e组的小计结果

我还跳过了LINQ,并使用一个字典(T1,T2)成功地实现了这一点。这样,我阅读每一行文本,创建一个aRecord实例,并将其总数应用到字典中相应的键值对。在这种方法中,只有一个aRecord实例。这是一种高效的内存方式——内存消耗趋于平稳,并保持相对较低的水平


因此,字典方法适用于1GB文件。但是有LINQ替代方案吗?

坚持使用
字典解决方案没有什么错,但是如果您想使用LINQ,可以使用
聚合

Dim summarizedRecs = File.ReadLines(filepath) _
                         .Skip(1) _
                         .Select(Function(line) New aRecord(line))
                         .Aggregate(New Hashtable(), Function(acc, cur) 
                                                        acc(cur.A) += cur : Return acc
                                                     End Function)
以及一个
aRecord
类,为了方便起见,该类实现了
+
-运算符:

Private Class aRecord
    Public Property A As String
    Public Property B As Integer
    Public Property G As Integer
    Public Property L As Integer
    Public Shared Operator +(a As aRecord, b As aRecord) As aRecord
        If a is Nothing Then Return b

        Return New aRecord() With { _
            .A = a.A, _
            .B = a.B + b.B, _
            .G = a.G + b.G, _
            .L = a.L + b.L _
        }
    End Operator
End Class
我在这里使用
Hashtable
而不是
Dictionary
,因为
Hashtable
如果找不到特定的键,就会返回
Nothing
,并在
+
-运算符中滥用这一事实(只是为了保存一些代码行)

我也不知道您的
aRecord
类的其他功能,但在本例中,我滥用它来存储累积字段
B
G
、和
L
(同样是为了保存一些代码行)


但是,在现实世界的应用程序中,我可能会对每个
循环使用一个简单的
,而不是试图变得聪明。

坚持使用您的
字典
解决方案没有错,但是如果您想使用LINQ,您可以使用
聚合

Dim summarizedRecs = File.ReadLines(filepath) _
                         .Skip(1) _
                         .Select(Function(line) New aRecord(line))
                         .Aggregate(New Hashtable(), Function(acc, cur) 
                                                        acc(cur.A) += cur : Return acc
                                                     End Function)
以及一个
aRecord
类,为了方便起见,该类实现了
+
-运算符:

Private Class aRecord
    Public Property A As String
    Public Property B As Integer
    Public Property G As Integer
    Public Property L As Integer
    Public Shared Operator +(a As aRecord, b As aRecord) As aRecord
        If a is Nothing Then Return b

        Return New aRecord() With { _
            .A = a.A, _
            .B = a.B + b.B, _
            .G = a.G + b.G, _
            .L = a.L + b.L _
        }
    End Operator
End Class
我在这里使用
Hashtable
而不是
Dictionary
,因为
Hashtable
如果找不到特定的键,就会返回
Nothing
,并在
+
-运算符中滥用这一事实(只是为了保存一些代码行)

我也不知道您的
aRecord
类的其他功能,但在本例中,我滥用它来存储累积字段
B
G
、和
L
(同样是为了保存一些代码行)


但是,在现实世界的应用程序中,我可能会对每个
循环使用一个简单的
,而不是试图变得聪明。

你知道术语数据库吗?;-)除此之外,如果
字典
方法有效,就使用它。是的,是的,是的。。。当前没有对一个的写入/导入访问权限。就结果而言,SQL GROUP BY就是我想要的。你知道术语数据库吗?;-)除此之外,如果
字典
方法有效,就使用它。是的,是的,是的。。。当前没有对一个的写入/导入访问权限。就结果而言,SQL GROUP BY就是我想要的。我肯定不知道如何使用聚合。那很有帮助。我希望有一种使用匿名类型的解决方案。我想他们会让切换分组字段或使用多个字段变得更容易。多米尼克,谢谢你的快速响应和非常清晰、清晰的记录。我肯定不知道如何使用聚合。那很有帮助。我希望有一种使用匿名类型的解决方案。我想他们会使切换分组字段或使用多个字段变得更容易。多米尼克,谢谢你的快速响应和非常清晰、清晰的文字。