Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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
C# VB.Net中数据表每列中的最大字符串长度_C#_Vb.net_Datatable - Fatal编程技术网

C# VB.Net中数据表每列中的最大字符串长度

C# VB.Net中数据表每列中的最大字符串长度,c#,vb.net,datatable,C#,Vb.net,Datatable,我需要知道数据表中每列的最大当前长度(使用VB.Net) 我需要每个列的最大.ToString.Length 我找到了下面的C#代码,但无法将其翻译成VB.Net List<int> maximumLengthForColumns = Enumerable.Range(0, dataTable.Columns.Count) .Select(col => dataTable.AsEnumerable()

我需要知道数据表中每列的最大当前长度(使用VB.Net)
我需要每个列的最大
.ToString.Length

我找到了下面的C#代码,但无法将其翻译成VB.Net

List<int> maximumLengthForColumns = 
   Enumerable.Range(0, dataTable.Columns.Count)
             .Select(col => dataTable.AsEnumerable()
                                     .Select(row => row[col]).OfType<string>()
                                     .Max(val => val.Length)).ToList();

您还必须翻译这些lambda:

Dim maximumLengthForColumns As List(Of Integer) = Enumerable.Range(0, dataTable.Columns.Count).Select(Function(col) dataTable.AsEnumerable().Select(Function(row) row(col)).OfType(Of String)().Max(Function(val) val.Length)).ToList()

DataTable
公开一个
Columns
属性,该属性是列定义的集合。每个项目(实际上是
DataColumn
类型)都会公开允许的最大长度。您找到的代码示例只查看存储在表中的数据。也就是说,它返回的是数据使用的当前最大长度,而不是列支持的最大长度

要检索允许的最大长度,只需扫描提供的DataTable对象的DataColumns属性并使用
MaxLength
属性

下面是一个使用LINQ语法的代码段:

Dim maximumLengthForColumns = From c in dataTable.Columns.Cast(Of DataColumn)
        Order By c.Ordinal
        Select c.MaxLength
实际的类型不完全是一个列表。它是
IQueryable(整数的)
。您可以使用
.ToList()
强制枚举和转换,而不是让它闲置,直到您实际需要使用结果为止。如果只需要枚举结果,则可以将其保留为IQueryable,因为接口确实继承自IEnumerable

我不需要包括订单条款。这可能会减慢实际执行的速度。但是,如果您的数据表中有太多的列,以致于这成为了一个真正的瓶颈,那么您需要被带回去,并给出一些其他补救说明

为什么我没有添加筛选子句(
Select
)?
MaxLength
属性对所有列公开,而不仅仅是字符串类型。而且,结果的简单枚举可能与原始数据表中的列数相匹配。如果没有,可以将该子句添加到LINQ语句中

Where c.DataType = GetType(String)
非LINQ答案

Dim maximumLengthForColumns As New List(Of Integer)
For i As Integer = 0 To dtb.Columns.Count - 1
  maximumLengthForColumns.Add(dtb.Columns(i).MaxLength)
Next i

如果列的大小不受限制,则
MaxLength
属性返回
-1

出于两个原因,我被迫按照@Putonix所说的那样在数据表上使用循环:

1) 我无法使用翻译后的
C
代码,因为即使所有单元格都有一个值,它也会给我错误“序列不包含元素”,而且它似乎只针对字符串字段编写。
目前我的知识还不足以成功地编辑这段代码,从而使其适应我的需要

2) 建议使用
MaxLength
的两个答案没有给出我需要的内容,因为我需要的是每列的当前长度,而不是允许的最大长度

谢谢大家的帮助

下面是我使用的代码:

Dim MaxColLen作为新字典(字符串,整数)
对于y,作为整数=0到DT.Columns.Count-1
Dim Col As String=DT.Columns(y).ColumnName
MaxColLen.Add(列,0)
对于x作为整数=0到DT.Rows.Count-1
如果DT.行(x)(列).ToString.Length>MaxColLen(列),则
MaxColLen(列)=DT.行(x)(列)到字符串长度
如果结束
下一个
下一个

发布的自我回答是迭代所有列,并将它们视为字符串列,即使它们不是。也就是说,它正在测量和收集非字符串数据的
.ToString
长度(这似乎不是所需的长度)

可以通过以下方式忽略非字符串数据列:

Dim MaxColLen作为新字典(字符串,整数)
对于dtSample.Columns中的每个dc作为DataColumn
如果dc.DataType是GetType(String),那么
MaxColLen.Add(dc.ColumnName,0)
对于dtSample.Rows中的每个dr As数据行
如果dr.Field(字符串的)(dc.ColumnName).Length>MaxColLen(dc.ColumnName),则
MaxColLen(dc.ColumnName)=dr.Field(字符串的)(dc.ColumnName).Length
如果结束
下一个
如果结束
下一个
请注意,它对每个使用
,以减少代码中的混乱,并允许使用
数据行
扩展,如
字段()
。就我个人而言,我认为
字段(Of T)(Col)
DT.Rows(x)(Col)更可读。ToString
虽然如果您确实想测量非字符串数据,那么在非文本数据上使用它肯定会崩溃

请注意,循环跳过非字符串列。要查找715000行中最长的文本,原始文本需要~34毫秒,而上面的文本需要~9毫秒

相同字典方法的linqy版本(注释解释步骤):

将cols视为cols “b)只有字符串 'c)获取匿名类型的名称和初始zed值 'd)转换为字符串的字典,Int以存储最长的字符串 Dim txtCols=dtSample.Columns.Cast(数据列的)。 其中(函数(c)c.DataType=GetType(字符串))。 选择(带有{.Name=q.ColumnName、.Length=0}的函数(q)New)。 ToDictionary(字符串,Int32)(函数(k)k.名称,函数(v)v.长度) '将关键点放入数组以交互 '收集每个的最大长度 对于txtCols.Keys.ToArray中作为字符串的每个colName txtCols(colName)=dtSample.AsEnumerable()。 Max(函数(m)m.Field(字符串的)(colName).Length) 下一个

对于相同的715k行,此表格需要约12 ms。扩展方法几乎总是比较慢,但是这些差异都不值得担心。

您应该能够通过在VB中键入相同的单词来翻译它们。对于换行符,请将点保留在前一行。您尝试过使用联机C#to VB转换器吗?@puropoix我尝试过一行这种方式(但它给了我错误):
Dim maximumLengthForColumns As List(Of Integer)=Enumerable.Range(0,DT#IntCalc.Columns.Count)。选择(col>=DT IntCalc.AsEnumerable()。选择(row>=row[coll])。类型(关于字符串).Max(Val()>=Val.Length)).ToList()
ahh,诀窍是C#中的
=>
转换为冗长的
Dim maximumLengthForColumns As New List(Of Integer)
For i As Integer = 0 To dtb.Columns.Count - 1
  maximumLengthForColumns.Add(dtb.Columns(i).MaxLength)
Next i