LINQ Query пропускает без исключения. Зачем? - PullRequest
1 голос
/ 16 февраля 2009

У меня есть метод, который получает вложенный массив в качестве параметра:

Number[][] data 

где Number - мой очень простой класс, который наследуется от INotifyPropertyChange.

А потом у меня есть такое утверждение:

double[] max = (double[])data.Select(crArray => crArray.Select( cr => cr.ValueNorm ).Max());

Когда я пытаюсь посмотреть его в отладчике, он просто пропускает его, и весь метод, хотя исключение не появляется.

Какой ответ? И как лучше это сделать.

Конечно, я могу использовать петли - но это выглядит так грязно и долго. Так что LINQ предпочтительнее

P.S. Я использую VS2008 SP1

Ответы [ 3 ]

1 голос
/ 16 февраля 2009

Вы уверены, что метод Select возвращает массив? Кастинг + дженерики = код запаха

Попробуйте это:

double[] max = data
  .Select(crArray => crArray.Select( cr => cr.ValueNorm ).Max())
  .ToArray();

Метод преобразования - (ToArray) выделяет новый массив и заполняет его. Связан ограничениями методов.

Down Casting - позволяет изменить тип ссылки на экземпляр объекта. Разрешается только фактический тип экземпляра или некоторый тип, от которого наследуется тип экземпляра. Все остальное дает исключение во время выполнения.

Оператор явного преобразования - использует синтаксис понижающего преобразования, чтобы добиться эффекта преобразования. Это действительно метод конверсии. Это бесконечный источник путаницы для людей, пытающихся понять кастинг.

Рассмотрим этот код:

// reference type is IEnumerable<string>, instance type is string[]
IEnumerable<string> myArray =
  new string[3] { "abc", "def", "ghi" };
// reference type is IEnumerable<string>, instance type is ???
IEnumerable<string> myQuery = myArray
  .Select(s => s.Reverse().ToString());

//Cast - works
string[] result = (string[]) myArray;
//Cast - runtime exception: System.InvalidCastException
result = (string[])myQuery;
//Conversion - works
result = myQuery.ToArray();

Почему вы не получили исключение времени выполнения в vs? Я не знаю.

1 голос
/ 16 февраля 2009

Обычно этот тип поведения означает, что ваши файлы исходного кода не обновлены. Попробуйте удалить все файлы .bin и .pdb из выходного каталога и пересобрать.

0 голосов
/ 16 февраля 2009

Вы пытались перебрать max? Я думаю, что это не сработало, потому что вы не перебрали результат вашего запроса (Linq запускает ваш запрос только после первого вызова GetEnumerator.

Метод ToArray перебирает все перечисленные в вашем запросе и копирует каждую вещь в массив. Я думаю, что это разница.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...