【问题标题】:VB LINQ - Take one random row from each groupVB LINQ - 从每组中随机抽取一行
【发布时间】:2015-06-17 18:15:15
【问题描述】:

我正在尝试从每组行中获取一个随机行。我正在尝试使用 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

对于每个 AnswerGroup,我需要选择一个随机的密钥/名称对。

我开始使用 LINQ 查询,但坦率地说,我迷路了,因为我不了解 LINQ 分组以及如何将 Enumerable.Take(1) 添加到组中。

    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 

任何帮助将不胜感激。谢谢!


编辑: 我可以在调试器中展开以下查询,以查看生成一系列 DataRows 的 In Memory Query。当我将鼠标悬停在 questionGroups 上时,它说它是一个 IEnumerable(Of Object)。当我尝试将该查询运行到列表或 DataTable 中时,出现错误:

“类型‘WhereSelectEnumerableIterator(Of VB$AnonymousType_0(Of Object,IEnumerable(Of Object)),Object)' 不是 找到了。”

    Dim answerGroup As String = "QuestionSortKey"
    Dim answerNo As String = "AnswerNo"
    Dim surveyDefinitionNo As String = "Pk_SurveyDefinitionNo"

    Dim query = _
        From rows In surveyAnswerKeys.Rows _
        Where rows(answerNo) IsNot Nothing _
        Order By Guid.NewGuid() _
        Group By questionSortKey = rows(answerGroup) _
        Into questionGroups = Group _
        Select questionGroups.First()

    Dim randomAnswerNos As DataTable = query.ToTable

【问题讨论】:

    标签: vb.net linq random


    【解决方案1】:

    洗牌项目的一种快速方法是按“随机”值排序 - 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 中。然后我们选择每个questionGroups的第一行?我想我明白了。谢谢!
    • 从技术上讲,它不会添加新列 - 它只是将每一行与 Guid“关联”并在排序时使用该值 - 从概念上讲您可以将其视为添加一列,但在机械上略有不同。
    • GUID 未定义为随机的。你唯一希望他们是。
    • @MarcJohnston 是的,我依赖Guid.NewGuid() 创建一个“随机”Guid 的实现细节(这意味着它们不是任何容易辨别的顺序)。对于大多数应用程序来说,这似乎已经足够了。
    • 没错,我需要一个“足够好”,因为我正在创建用于测试的样本数据。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 2020-05-28
      • 2022-08-19
      • 1970-01-01
      • 2021-01-24
      相关资源
      最近更新 更多