Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.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/linq/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
在VB.NET中使用大型数组_Vb.net_Linq_Arrays_Excel - Fatal编程技术网

在VB.NET中使用大型数组

在VB.NET中使用大型数组,vb.net,linq,arrays,excel,Vb.net,Linq,Arrays,Excel,我想从Excel中提取大量数据,对其进行操作并将其放回原处。我发现最好的方法是将Excel区域中的数据提取到一个大数组中,更改数组中的内容并将其写回Excel区域 我现在正在使用VB.NET 2008/2010重写应用程序,并希望利用任何新功能 目前,我必须遍历数组的内容,以找到具有特定值的元素;此外,对大型阵列进行排序也很麻烦。我希望使用新功能,包括LINQ来操作数组中的数据 有没有人对在大数组中过滤/查询、排序等数据的最简单方法有什么建议。另外,阵列大小的合理限制是什么 ~z~非常感谢出于好

我想从Excel中提取大量数据,对其进行操作并将其放回原处。我发现最好的方法是将Excel区域中的数据提取到一个大数组中,更改数组中的内容并将其写回Excel区域

我现在正在使用VB.NET 2008/2010重写应用程序,并希望利用任何新功能

目前,我必须遍历数组的内容,以找到具有特定值的元素;此外,对大型阵列进行排序也很麻烦。我希望使用新功能,包括LINQ来操作数组中的数据

有没有人对在大数组中过滤/查询、排序等数据的最简单方法有什么建议。另外,阵列大小的合理限制是什么


~z~非常感谢

出于好奇,我查看了这张照片,我认为LINQ不适合。我假设您正在将命名范围读入对象的“矩形”数组。如果是这种情况,那么坏消息是,矩形数组是不可枚举和不可查询的,这意味着您无法对其执行LINQ查询。有关详细信息,请参见以下讨论:

我被纠正了。感谢jdk和AMissico花时间解释

虽然您有一个多管齐下的问题,但我选择回答有关使用LINQ操纵数组的部分

编辑-基于二维数组的LINQ,VB.NET System.Array(从中派生所有数组)支持扩展方法,这意味着您可以直接使用LINQ处理2D数组,如下所示:

Option Infer On
Option Strict Off

Public Class DataProcessor

    'something like this came from Excel, maybe a Range
    Dim arrValues2D(,) As String = { _
        {"1", "2", "3"}, _
        {"100", "99", "98"}, _
        {"2", "3", "4"} _
    }

    Private Sub FindLargeNumbers()

        'LINQ against 2D array elements
        Dim query = From v In arrValues2D Where (Int32.Parse(v) > 50 And Int32.Parse(v) < 101) Select CStr(v)

        For Each thing As String In query
            'do stuff
            Console.Write(thing + ",")
        Next

    End Sub
End Class
选项推断打开
选择严格关闭
公共类数据处理器
“类似的东西来自Excel,可能是一个范围
Dim ARRRVALUES2D(,)作为字符串={_
{"1", "2", "3"}, _
{"100", "99", "98"}, _
{"2", "3", "4"} _
}
私有子FindLargeNumber()
'针对2D数组元素的LINQ
Dim query=从arrValues2D中的v开始,其中(Int32.Parse(v)>50和Int32.Parse(v)<101)选择CStr(v)
对于查询中作为字符串的每个对象
“做事
控制台。写(东西+“,”)
下一个
端接头
末级
原创思想 (自从使用上述解决方案以来,几乎不推荐使用)

您可以“展平”2D数组(有效地一次返回一个值,就像它是1D数组一样),并使用LINQ对值执行操作

根据数组元素的数据类型,为了回写它们,可能需要将每个值包装成某种形式,以便可以引用原始元素而不是其值的副本


这只是一个总体计划,允许您使用LINQ和“新功能”来对付一个已经从Excel中获得的大型高效2D数组

如果要获得任何性能,必须坚持将数据提取到数组中,操纵数组,然后将数据写回范围中。性能优势是显著的。我已经测试过了,速度快了几百倍

我使用自定义函数执行所有数组操作。我认为LINQ在速度上无法与我的自定义函数相比。LINQ带来的是灵活性、可读性和可维护性。如果您在设计自定义数组操作函数时考虑了LINQ原则,那么您应该能够在不放弃性能的情况下利用LINQ。例如,我有一个中值数组函数。我将其转换为一个中值扩展函数,该函数接受一系列双精度,然后在数组上使用LINQ调用中值函数

<Extension()> Public Function Median(ByVal source As IEnumerable(Of Double)) As Double

您引用的信息可能是旧的或错误的,因为在VB.NET中可以对矩形数组使用LINQ。请参阅my answer.IEnumerable query=arrValues2D.Cast()。其中(v=>int.Parse(v)>50&&int.Parse(v)System.Convert.ToString(v));问题是jdk有选项inferon和选项Strict Off,这允许VB.NET编译器使用他的语法。如果关闭“推断”并启用“严格”,他的语法将遭受相同的编译器错误。似乎存在多个问题:如何在数组上使用新的语言功能,如何操作数组,数组大小。jdk,我感到困惑,因为这段代码,相当于你的C#代码,甚至没有在我的机器上编译。int[,]数组=新的int[,]{{1,1},{2,3};var query=from数组中的c,其中c==1选择c;具体来说,where语句失败(如果我删除它,select也会失败)。所以要么VB的行为不同,要么我遗漏了什么!我试过将字符串数组转换为int-to,同样的问题。@Mathias:C#和VB.NET有不同的语法顺序-您可能做了错误的C#等价物。无论哪种方式,关于VB.NET和LINQ对抗2D数组的问题都可以使用这段代码工作——只需复制和粘贴并运行它——您将看到从2D数组中提取的结果。我想我听说VB.NET和C#是独立变化的(两个不同的团队)尽管他们试图将重要的功能移植到两者,但问题是jdk有Option Inferre On和Option Strict Off,这允许VB.NET编译器使用他的语法。如果关闭“推断”并启用“严格”,他的语法将遭受相同的编译器错误。感谢您的回复,您是否在处理大型数组时遇到问题,例如100000行X 200列根本没有问题。正如广告所宣传的那样,它工作得非常出色。用两个数据透视表来进行“复杂”的数组操作,将数据乘以5。我将以编程方式操作一个透视表,然后为计算的下一步提取数组。如果您可以在透视表中执行此操作,请执行此操作。它比数组快。哦,我确实把大数组分成了块,这样我就可以用一个取消按钮来维护一个进度表。我还将计算分为两部分;参数阶段(三分钟)和计算阶段(五分钟)。这允许用户在显示报告之前使用指定的参数查看初步数据,而不是强迫用户等待。
Dim m = Aggregate v In arrValues2D Into Median(CDbl(v))