【问题标题】:LINQ DataTablesLINQ 数据表
【发布时间】:2017-09-06 11:46:55
【问题描述】:

我有一个包含超过 100 列和超过 280 行的数据表,我需要对其进行分组 通过不同的 UserID,然后单独处理每一行。这 UserID 是唯一的,但是,每个 UserID 可以有多行(每个 UserID 可以有 1 到 20 行与之关联)。 包括 UserID 在内的所有列都是字符串值。

我使用过这样的代码:

Dim src = From row In sampleTable.AsEnumerable()

返回一个 EnumerableRowCollection(Of DataRow),但是当我尝试按 DataTable 的 UserID 列出现错误。

我需要通过区分用户 ID 对 DataTable 中的行进行分组并处理每一行。我还需要跟踪每 10 个 我处理不同的 UserID 以满足子处理要求。

如何按不同的 UserID 对 DataTable 进行分组并访问所有具有重复 UserID 的行?

在收到到目前为止的回复后,我尝试了这个:

Dim src = loanTable.AsEnumerable().ToLookup(x >= x.bSSN, x >= x)

并在 ToLookup() 上出错。 “重载解析失败,因为无法使用这些参数调用可访问的‘ToLookup’(无法推断类型参数‘TKey’)。 另外,ToLookup(x => x.UserID, x => x) 中的 'x' 会返回一个没有声明 'x' 的错误。

【问题讨论】:

  • 您能否提供您当前的尝试并附加完整的错误消息。

标签: vb.net linq datatable grouping


【解决方案1】:

我不知道您对GroupBy 的问题,但这可行:

Dim userIdGroups = sampleTable.AsEnumerable().GroupBy(Function(row) row.Field(Of Int32)("UserId"))

现在每个组都包含具有该 UserId 的所有行。

另一种选择是使用查找(类似于字典,但您可以访问不可用的键,并且您会得到一个空的行序列而不是异常):

Dim userIdLookup = sampleTable.AsEnumerable().ToLookup(Function(row) row.Field(Of Int32)("UserId"))

Dim userid1Rows As IEnumerable(Of DataRow) = userIdLookup(1)

您还可以使用For each 枚举GroupByLookup 的所有组。

For Each rg In userIdLookup 
    Dim userid = rg.Key
    Dim count = rg.Count()
    ' if you want to enumerate the rows:
    For Each row In rg
        ' process
    Next
Next

【讨论】:

  • 您所指的 For each 将如下所示: For Each row In userIdGroups Next --?
  • @RandyJohnson:代码中的row 变量将具有Key 属性,您可以在其中访问UserId
  • 好的,我知道在哪里可以获得每个组的密钥以及计数,我是否使用嵌套的 For Each 来处理每个组中的每一行?我必须从每一行的每一列中获取信息并将其输入到 IBM Mainframe Reflections 会话中。
  • @RandyJohnson:添加
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2020-12-26
  • 2015-09-16
  • 2019-02-10
相关资源
最近更新 更多