Vb.net VB LINQ-从每组中随机抽取一行
我试图从每组行中随机获得一行。我正在尝试使用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
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()