3

我有一个 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 循环是最好的方法。

任何帮助将非常感激。谢谢

4

3 回答 3

5

不要忘记TakeTakeWhile

从TakeWhile...

只要指定条件为真,就从序列中返回元素,然后跳过其余元素。

于 2011-11-11T16:13:17.223 回答
4

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

MarketDataType result = queryMarkets.FirstOrDefault();

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

于 2011-11-11T15:52:28.473 回答
1

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

于 2011-11-11T15:53:35.827 回答