有没有办法在完成自定义WHERE子句时中断LINQ SELECT

时间:2011-11-11 15:50:45

标签: c# .net linq ienumerable betfair

我有一个LINQ语句,它使用自定义函数在压缩字符串中查找某些匹配数据。

只有一场比赛,如果我做了一个FOR循环,我会在找到数据后添加一个“中断”。然而,使用LINQ似乎迭代遍历所有记录寻找匹配是否需要(从SQL /子集的角度来看是有意义的)但是我想知道是否有一种方法可以在完成时使LINQ语句中断WHERE子句,以便在找到匹配的记录后不必继续搜索匹配的记录。

我可以重新编写它以使用FOR循环,但我想知道是否有一种方法可以限制LINQ语句在X迭代后停止搜索(如果条件已匹配)。

代码在

之下
    IEnumerable<MarketDataType> queryMarkets =
            from m in Mdata
            where !String.IsNullOrEmpty(m)
            let field = m.Split('~')
            where (MatchMarket(field[5], BaseDate.AddMilliseconds(DaylightSavings + Convert.ToDouble(field[4])), field[1], racecourse, racedatetime, marketType))
            select new MarketDataType()
            {
                marketId = Convert.ToInt32(field[0]),
                marketName = field[1].Replace(ColonCode, ":"),
                marketType = field[2],
                marketStatus = field[3],
                eventDate = BaseDate.AddMilliseconds(DaylightSavings + Convert.ToDouble(field[4])),
                menuPath = field[5].Replace(ColonCode, ":"),
                eventHeirachy = field[6],
                betDelay = Convert.ToInt32(field[7]),
                exchangeId = Convert.ToInt32(field[8]),
                countryCode = field[9],
                lastRefresh = BaseDate.AddMilliseconds(DaylightSavings + Convert.ToDouble(field[10])),
                noOfRunners = Convert.ToInt32(field[11]),
                noOfWinners = Convert.ToInt32(field[12]),
                totalAmountMatched = Convert.ToDouble(field[13]),
                bspMarket = (field[14] == "Y"),
                turningInPlay = (field[15] == "Y")
            };

        marketData = queryMarkets.ToList();

我可以添加另一个WHERE子句,以某种方式查看我的IEnumerable对象MarketDataType,以确保如果存在一行,那么它被忽略了吗?或者重写这个作为foreach / for循环是最好的方法。

非常感谢任何帮助。感谢

3 个答案:

答案 0 :(得分:4)

听起来你想要First()FirstOrDefault()Single()SingleOrDefault()

MarketDataType result = queryMarkets.FirstOrDefault();

(如果只有一个结果,所有这些方法都会给你相同的结果;它们对零或多个结果的处理有所不同。)

答案 1 :(得分:3)

不要忘记TakeTakeWhile

来自TakeWhile ......

  

只要指定的条件为true,就返回序列中的元素,然后跳过剩余的元素。

答案 2 :(得分:1)

只需在First()上使用ToList()代替IEnumerable,这将在第一场比赛后停止评估。