Есть ли способ выйти из 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
, это остановит оценку после первого матча.