Опубликованные самостоятельно ответ итерация всех столбцов и обрабатывать их как строки столбцов, даже если они не являются. То есть, он измеряет и собирает длину данных Data12, не являющуюся строкой (что, похоже, не является желательным).
Не связанные струнные datacolumns можно опустить так:
Dim MaxColLen As New Dictionary(Of String, Integer)
For Each dc As DataColumn In dtSample.Columns
If dc.DataType Is GetType(String) Then
MaxColLen.Add(dc.ColumnName, 0)
For Each dr As DataRow In dtSample.Rows
If dr.Field(Of String)(dc.ColumnName).Length > MaxColLen(dc.ColumnName) Then
MaxColLen(dc.ColumnName) = dr.Field(Of String)(dc.ColumnName).Length
End If
Next
End If
Next
Обратите внимание, что она использует For Each
, чтобы уменьшить беспорядок в коде и позволяют использовать DataRow
расширений, таких как Field<T>()
. Лично я думаю, что Field(Of T)(Col)
более читаем, чем DT.Rows(x)(Col).ToString
, хотя если вы do действительно хотите измерить не строковые данные, используя его на нетекстовых данных, обязательно сбой.
Обратите внимание, что цикл пропускает строки, отличные от строки. Чтобы найти самый длинный текст в 715 000 строк, оригинал занимает ~ 34 мс, а выше - ~ 9 мс.
linqy версии одного и того же подхода словаря (с комментариями, объясняющих шаги):
' a) look at cols as cols
' b) just the string ones
' c) get the name and inital zed value to an Anonymous type
' d) convert to a dictionary of String, Int to store the longest
Dim txtCols = dtSample.Columns.Cast(Of DataColumn).
Where(Function(c) c.DataType = GetType(String)).
Select(Function(q) New With {.Name = q.ColumnName, .Length = 0}).
ToDictionary(Of String, Int32)(Function(k) k.Name, Function(v) v.Length)
' get keys into an array to interate
' collect the max length for each
For Each colName As String In txtCols.Keys.ToArray
txtCols(colName) = dtSample.AsEnumerable().
Max(Function(m) m.Field(Of String)(colName).Length)
Next
Эта форма занимает ~ 12 мс для одних и тех же 715k строк. Методы расширения почти всегда медленнее, но ни одна из этих различий не стоит беспокоиться.
Вы должны уметь это перевести, просто набрав те же слова в VB. Для строк новой строки оставьте точку на предыдущей строке. – Plutonix
Вы пробовали использовать онлайн-конвертер C# в VB? –
@Plutonix Я пробовал на одной строке таким образом (но это дает мне ошибки): 'Dim maximumLengthForColumns As List (Of Integer) = Enumerable.Range (0, DT_IntCalc.Columns.Count). Выберите (col> = DT_IntCalc. AsEnumerable(). Выберите (row> = row [col]). OfType (Of String) .Max (Val()> = Val.Length)). ToList() ' – genespos