Есть ли способ выйти из LINQ SELECT по завершении пользовательского предложения WHERE

У меня есть оператор 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 ответа

Не забывай Take а также TakeWhile

От TakeWhile...

Возвращает элементы из последовательности, если заданное условие выполняется, а затем пропускает остальные элементы.

Звучит так, как ты хочешь First(), FirstOrDefault(), Single() или же SingleOrDefault():

MarketDataType result = queryMarkets.FirstOrDefault();

(Все эти методы дадут вам один и тот же результат, если будет ровно один результат; они отличаются обработкой нуля или нескольких результатов.)

Просто используйте First() вместо ToList() на IEnumerable, это остановит оценку после первого матча.

Другие вопросы по тегам