正在为DataTable VB.Net查找等效于Excel COUNTA的函数

kmbjn2e3  于 2023-01-14  发布在  .NET
关注(0)|答案(1)|浏览(132)

我正在尝试为DataTable查找与Excel CountA函数等效的函数。

'This code works for searching through a range of columns in Excel
        If xlApp.WorksheetFunction.CountA(WS.Range("A" & i & ":G" & i)) > 0 Then
            DataExists = True
        End If
'This is the code I need help with for searching though a DataTable
        If DataTbl.Rows(i).Item(0:6).ToString <> "" Then
            DataExists = True
        End If

希望有人能帮忙。

wqnecbli

wqnecbli1#

我认为您只需要一个for-each循环。

internal static int CountForEach(this DataTable? dt)
{
    if (dt == null)
        return 0;
    int count = 0;
    foreach (DataRow row in dt.Rows)
        foreach (object? o in row.ItemArray)
            if (o != DBNull.Value)
                count++;
    return count;
}

用法:

DataTable dt = GetYourDataTable();
int countValues = dt.CountNotNullValues_ForEach();

这在LINQ中也是可行的,但我认为它会更慢--我将在以后运行一些基准测试并更新我的答案。
编辑
我添加了这两个LINQ方法:

internal static int CountLinqList(this DataTable? dt)
{
    int count = 0;
    dt?.Rows.Cast<DataRow>().ToList().ForEach(row => count += row.ItemArray.Where(g => g != DBNull.Value).Count());
    return count;
}

internal static int CountLinqParallel(this DataTable? dt)
{
    ConcurrentBag<int> ints = new();
    dt?.AsEnumerable().AsParallel().ForAll(row => ints.Add(row.ItemArray.Where(g => g != DBNull.Value).Count()));
    int count = ints.Sum();
    return count;
}

以下是使用BenchmarkDotNet获得的统计数据:

我使用了一个伪随机生成的约550万行和3列的数据表作为测试,我认为这些结果可能会随着数据表的增大而改变,但对于较小的数据表(约500k行或更少),最快的方法可能是简单的for-each循环。
最快的方法:
1.对于每个回路
1.线性并联
1.链接列表〉用于每个
我当然不是LINQ大师,但我想成为,所以如果有人有更好的LINQ实现,请让我知道。顺便说一句,我不认为这可能是典型的LINQ用例。

相关问题