【发布时间】: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
name="奇数" 价格=2
name="1" price=36
name="4" price=36
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选择中包含的名称之外的任何内容我会尝试并添加与此同时,listOfSelectionNames和Market.Selections中的一些例子 -
这很奇怪,我能给你的唯一线索是:Market.Selections.Name 被声明为字符串隐含?如果是,请检查拼写(小写、空格等)。如果不是,那就是问题所在,请先进行强制转换,或使用“等于”。如果您让编译器推断变量“Name”的类型,它应该将其声明为“object”,并且对于比较对象,您不能直接使用“=”。