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

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

4 голосов
/ 11 ноября 2011

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

MarketDataType result = queryMarkets.FirstOrDefault();

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

3 голосов
/ 11 ноября 2011

Не забудьте Take и TakeWhile

From TakeWhile ...

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

1 голос
/ 11 ноября 2011

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

...