Vb.net VB LINQ-从每组中随机抽取一行

Vb.net VB LINQ-从每组中随机抽取一行,vb.net,linq,random,Vb.net,Linq,Random,我试图从每组行中随机获得一行。我正在尝试使用LINQ,但我不确定这是否是正确的方法。我想要一本钥匙/姓名对词典 我的桌子是这样的: AnswerGroup AnswerKey AnswerName --------------------------------------------- 1 1 Yes 1 2 No 2 1 Never 2

我试图从每组行中随机获得一行。我正在尝试使用LINQ,但我不确定这是否是正确的方法。我想要一本钥匙/姓名对词典

我的桌子是这样的:

AnswerGroup     AnswerKey   AnswerName
---------------------------------------------
1               1           Yes
1               2           No
2               1           Never
2               2           A little bit
2               3           Mostly
2               4           Always
3               1           White
3               2           African American
3               3           Hispanic
3               4           Asian or Pacific Islander
对于每个应答组,我需要选择一个随机密钥/名称对

我有一个LINQ查询的开始,但坦率地说,我迷路了,因为我不了解LINQ分组以及如何添加可枚举项

    Dim answerGroup As String = "AnswerGroup"
    Dim answerKey As String = "AnswerKey"
    Dim answerName As String = "AnswerName"

    Dim query = _
        From rows As DataRow In surveyAnswerKeys.Rows _
        Order By rows(answerGroup) _
        Group By questionSortKey = rows(answerGroup) _
        Into questionGroups = Group 
任何帮助都将不胜感激。谢谢


编辑: 我可以在调试器中展开以下查询,以查看生成一系列数据行的内存中查询。当我将鼠标悬停在问题组上时,它表示这是一个IEnumerable(Of Object)。当我尝试在列表或数据表中运行该查询时,我得到错误:

“类型为”的公共成员“ToTable”,其中SelectEnumerableIterator(属于 VB$AnonymousType_0(对象的,IEnumerable(对象的)),对象)“不是 找到了。”


Linq不能用于拉取随机行。我建议您将所有行存储在一个表中,并手动循环每个组。然后根据每组中的行数,生成一个随机数并拾取该行。仅使用LINQ进行查询和检索结果。

一种快速的无序排列项目的方法是按“随机”值排序-
Guid.NewGuid()
通常工作得很好。然后只需从每组中拉出第一行:

Dim query = _
    From rows As DataRow In surveyAnswerKeys.Rows _
    Order By Guid.NewGuid() _
    Group By questionSortKey = rows(answerGroup) _
    Into questionGroups = Group _
    Select questionGroups.First() 

拉德。现在我只需要学习如何选择我需要的两行并将它们放入字典。让我来讨论一下:Guid.NewGuid()添加一列随机生成的Guid,并对所有列进行排序。Group By questionSortKey定义组,这些组存储在questionGroups中。然后我们选择每个问题组的第一行?我想我明白了。谢谢从技术上讲,它不会添加新列—它只是将每一行与Guid“关联”,并在排序时使用该值—从概念上讲,您可以将其视为添加列,但从机械上讲,它略有不同。Guid的定义不是随机的。您唯一希望的是它们。@MarcJohnston True,我依赖的是一个实现细节,它
Guid.NewGuid()
创建了一个“随机”的Guid(这意味着它们没有任何易于识别的顺序)。对于大多数应用程序来说,这似乎已经足够好了。没错,在创建测试样本数据时,我需要“足够好”。
Dim query = _
    From rows As DataRow In surveyAnswerKeys.Rows _
    Order By Guid.NewGuid() _
    Group By questionSortKey = rows(answerGroup) _
    Into questionGroups = Group _
    Select questionGroups.First()