2010-06-30 2 views
2
string grid = @"08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08"; 
string[] res = grid.Split(' '); 

var lowNums = from n in res 
       where n.Length > 0 
       select int.Parse(n); 

У меня возникли проблемы с преобразованием вышеуказанного выражения linQ в эквивалент лямбда. следующие работы, но только возвращает я enumernable<string> в то время как Я хочу enumerable<int>:Различные формы LinQ

IEnumerable<string> all = res.Where(x => x.Length > 0); 
+0

Хорошие ответы ниже; Я просто подумал, что могу упомянуть, что ReSharper 5 может сделать это за вас, и вы можете найти альтернативные синтаксисы. – AakashM

ответ

10

У меня возникли проблемы, преобразующий выше LINQ заявление лямбда, где() эквивалент.

Что вы хотите сделать, внимательно прочитайте раздел 7.16.2 спецификации C#. Он будет проходить шаг за шагом в процессе.

Он говорит:

Выражение запроса с ИНЕКЕ

from x in e 
where f 
... 

переводится в

from x in (e) . Where (x => f) 
... 

Так ваш запрос

from n in res 
where n.Length > 0 
select int.Parse(n); 

переводится в

from n in (res).Where(n=>n.Length > 0) 
select int.Parse(n) 

Это первый этап перевода.Теперь вернемся к спецификации снова:

Выражение запроса формы

from x in e select v 

переводится в

(e) . Select (x => v) 

Так Переведенные однократной уже запрос

from n in (res).Where(n=>n.Length > 0) 
select int.Parse(n) 

далее переведен на

((res).Where(n=>n.Length > 0)).Select(n=>int.Parse(n)) 

и теперь это не выражение запроса больше, поэтому больше не синтаксический перевод не делается.

9

Следующая должно работать. Вы просто забыли предложение select.

res.Where(n => n.Length > 0).Select(n => int.Parse(n)); 

Предложение where не изменит ваши данные в int. Но, Select(lambda) может.

5

Вам нужно включить вызов int.Parse, чтобы преобразовать результаты в int. Поскольку вы выполняете это после предложения «where», для этого потребуется Select(), который в основном позволяет вам изменить форму вашего перечисляемого (т. Е. Сопоставить его с новым типом, в данном случае преобразовать из строки в ИНТ):

var lowNums = res.Where(n => n.Length > 0).Select(n => int.Parse(n)); 
+0

Я хочу, чтобы ответы по-прежнему были отсортированы по возрасту: P' – jjnguy

+0

это здорово - работает как шарм - спасибо помощнику! – JoshBriggs

+1

@ Justin: Наши ответы были примерно на 10 секунд друг от друга - хотя я оставил только свой, потому что у меня был дополнительный «текст», описывающий ~ почему это требовалось, чтобы ваш ответ (в то время) отсутствовал. Я все еще оставляю это, так как мое описание отличается от вашего (что тоже правильно;) - и получил от меня голос) –

Смежные вопросы