【问题标题】:Linq statement only executing once and returning zero on second try and above in foreach loopLinq 语句仅执行一次,并在 foreach 循环中的第二次尝试及以上返回零
【发布时间】:2016-06-10 15:32:30
【问题描述】:

您好,我有一段代码可以收集可观察集合中选择的价格,并通过循环对其执行一些操作。代码如下所示。

      Dim listOfSelectionNames = GameBetCreator.SelectedNumbersString.Split(",")

        For Each selection In listOfSelectionNames
            Dim currentSelection = selection

            Dim price = (From sels In Market.Selections
                               Where sels.Name = currentSelection Select sels.Price).FirstOrDefault()

            Dim returns = (price * omrStake1.UnitStake) + omrStake1.UnitStake

            potentialReturnStringBuilder.AppendLine("Selection " + currentSelection + " Returns " + returns.ToString())

        Next

变量price 是一个int,market 是一个静态变量,永远不会为空。在循环中的第一个增量中,代码可以正常工作并返回一个值,但是每次之后,一旦它到达 linq 语句,变量 price 就会设置为零。在此之前,price 变量保留了前一个循环中的值(不知道为什么)。

我试图用一个循环遍历Market.Selections 中所有选择的foreach 循环替换linq,并执行一个if 语句来检查其中的名称是否与currentSelection 匹配,但它会产生相同的结果。据我所知,代码应该每次都能正常工作,所以我在这里不知所措。任何指导将不胜感激

编辑 - 应要求提供一些示例

listOfSelectionNames = "1", "4", "ODD", "1-12"

Market.Selections

  1. name="奇数" 价格=2

  2. name="1" price=36

  3. name="4" price=36

  4. name="1-12" price=12

请注意,永远不会出现listOfSelectionNames 包含的值在Market.Selections 列表中没有对应的selection.name 的情况

【问题讨论】:

  • 变量 price 通过迭代保持最后一个值,因为您仍然在相同的上下文中,只有在退出循环时它才会被“删除”。另一方面,您能告诉我们数组 Market.Selections 的内容,以及 listOfSelecionNames 的内容吗?
  • 嗨,listOfSelectionNames 只是一个字符串列表,它会循环遍历以在Market.Selections 中查找价格。至于Market.Selections 的列表,它只是一个类Selection 的列表,其中包含两个变量name 是一个字符串,price 是一个整数。有没有办法在循环的每个增量结束时清除上下文?我没有太多使用 VB,所以我仍然试图在这里掌握它。
  • 问题不应该是“清理上下文”,我认为问题更简单:您的“where 子句”与任何项目都不匹配,并且“价格”被推断为双倍。然后,如果您的 where 子句没有找到任何项目,FirstOrDefault 函数将返回 0。尝试一下:将“Dim price”更改为“Dim price as double”,将“firstordefault”更改为“first”。如果它没有找到任何项目,它将抛出一个期望。如果您发布变量的实际值将会很有帮助。
  • where 子句将始终与项目匹配,因为listOfSelectionNames 中的任何元素都不能填充Market.Selections 选择中包含的名称之外的任何内容我会尝试并添加与此同时,listOfSelectionNamesMarket.Selections 中的一些例子
  • 这很奇怪,我能给你的唯一线索是:Market.Selections.Name 被声明为字符串隐含?如果是,请检查拼写(小写、空格等)。如果不是,那就是问题所在,请先进行强制转换,或使用“等于”。如果您让编译器推断变量“Name”的类型,它应该将其声明为“object”,并且对于比较对象,您不能直接使用“=”。

标签: vb.net linq foreach


【解决方案1】:

问题是变量名有一个设置器来修剪空格If String.IsNullOrEmpty(value) = False Then strName = value.Trim,这意味着在将 currentSelection 传递给 linq 语句时我必须这样做。

因此代码看起来像这样

 Dim price = (From sels In Market.Selections
                           Where sels.Name = currentSelection.Trim() Select sels.Price).FirstOrDefault()

发布此内容只是为了帮助可能遇到相同问题的其他人

【讨论】:

    猜你喜欢
    • 2020-08-20
    • 2017-10-24
    • 2018-07-07
    • 1970-01-01
    • 2011-05-16
    • 2023-03-03
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多