IEnumerable <T>назначение - PullRequest
       22

IEnumerable <T>назначение

1 голос
/ 03 сентября 2011

У меня есть два объекта, объявленные как IEnumerable<DateTime> xVal и IEnumerable<double> yVal. Тогда где моя программа:

var xVals = from p in result where p.chemical == "Benzene" select p.SampDate_Name;
var yVals = from p in result where p.chemical == "Benzene" select p.PCL;

Тогда я пытаюсь выполнить следующее задание:

 xVal = xVals as IEnumerable<DateTime>;
 yVal = yVals as IEnumerable<double>;

И приведенный выше код устанавливает xVal и yVal в ноль .

Может кто-нибудь объяснить, что здесь не так? Я был бы очень признателен за помощь.

Спасибо.


Одно можно сказать наверняка: ввод не нулевой. Так что xVals и yVals не являются нулевыми, как отлажено мной. Я также могу просмотреть их, чтобы получить содержание каждого. Я попробую другие предложения, когда вернусь и опубликую свои выводы. Большое спасибо за ваши ответы.

Проблема здесь заключалась в том, что LINQ выполняется лениво. Он будет выполняться, когда вы выполняете foreach или ToList / ToArray / ToDictionary. Два запроса linq в моем коде не были выполнены до назначения. Следовательно, xVal и yVal были установлены в ноль. Спасибо за помощь.

Ответы [ 3 ]

3 голосов
/ 03 сентября 2011

Ключевое слово as установит вывод в null, если ввод был нулевым или приведение не могло быть выполнено.

Если бы вы использовали xVal = (IEnumerable<DateTime>)xVals, вы, вероятно, получили бы исключение, сообщающее, что оно не может быть разыграно.

MSDN описание для ключевого слова

1 голос
/ 03 сентября 2011

Если у вас есть универсальная коллекция, чтобы получить ее в IEnumerable, попробуйте .AsEnumerable ().Итак, ваш новый код ...

xVal = xVals.AsEnumerable();
yVal = yVals.AsEnumerable();
0 голосов
/ 03 сентября 2011

Ключевое слово as на самом деле не выполняет приведение, но выполняет преобразования между связанными ссылочными типами.Поэтому, если у вас есть конкретный тип, вы можете назначить его новой переменной с типом базового класса, используя as.Если типы не совместимы, то as возвращает null.Это хороший способ проверки типов, не беспокоясь об исключениях.Вместо этого вы можете выполнить нулевую проверку результата преобразования.

Трудно сказать, что такое типы p.SampDate_Name и p.PCL, но я бы предположил строки?Если это так, вы можете добавить приведение к оператору выбора.

var xVals = from p in result where p.chemical == "Benzene" select DateTime.Parse(p.SampDate_Name);
var yVals = from p in result where p.chemical == "Benzene" select Double.Parse(p.PCL);
...