LINQ: не Может неявно преобразовать тип 'Система. Наборы. Универсальный. IEnumerable <интервал>' к 'интервалу'

Лучший ответ для Вас является своего рода DVCS (популярные, являющиеся Мерзавец , Подвижный , Darcs, Базар ...). Причина состоит в том, что у Вас есть полная копия целого репозитория на любой машине, которую Вы используете. Я не использовал эти системы лично, таким образом, другие будут лучшими при рекомендации DVCS с маленьким местом и хорошей кросс-платформенной совместимостью.

5
задан Seph 8 March 2012 в 10:35
поделиться

4 ответа

What you want is this:

int[] dreamX;
private void Form1_Load(object sender, EventArgs e)
        { 
         sumX();
        }
 private void sumX()
        {
                dreamX =( from Control control in Controls                  
                         where control.GetType() == typeof(TextBox) &&
                               control.Name.StartsWith("box")
                         select Convert.ToInt32(((TextBox)control).Text))
                                       .ToArray();             
        }

The from clause produces a IEnumerable collection. You can convert this to an array with the .ToArray() extension

8
ответ дан 18 December 2019 в 05:29
поделиться

FirstOrDefault () превратит IEnumerable в int .

Фактически, это первое появление в outputresult вашего linq-запроса.

3
ответ дан 18 December 2019 в 05:29
поделиться

Что ж, этот запрос может возвращать более одного значения, поэтому вам нужно использовать либо .Single () , .First () или .FirstOrDefault () методы расширения.

Обратите внимание, что Single () будет работать, только если есть ровно один элемент в списке, First () будет работать, только если в списке есть хотя бы один элемент. FirstOrDefault () возвращается к значению по умолчанию (0), если в списке нет элемента.

В зависимости от того, что именно вам нужно, вам придется выбрать:)

13
ответ дан 18 December 2019 в 05:29
поделиться

В этом столько всего плохого.

Прежде всего, вы пытаетесь присвоить то, что потенциально множество преобразованных целых чисел, одному целому числу в массиве. Это то, о чем вам сообщает сообщение об ошибке.

Кроме того, нигде в показанном вами коде нет того, что массив когда-либо инициализировался. Так что даже если вы вызовете что-то вроде .FirstOrDefault () , вы получите исключение NullReferenceException . Лучше вообще не использовать архивы, если вы можете помочь. Просто придерживайтесь IEnumerable.

Кроме того, ваш запрос linq имеет дополнительный шаг; вместо того, чтобы проверять тип каждого элемента управления в коллекции Controls, вы должны вызвать его метод .OfType () .

Наконец, прелесть linq в том, что вам даже не нужно писать цикл for. Вы можете просто написать один оператор, который оценивает все ваши текстовые поля.

IEnumerable<int> dreamX;

private void Form1_Load(object sender, EventArgs e)
{ 
    sumX();
    int totalX = dreamX.Sum();
}

private void sumX()
{
    dreamX = from control in Controls.OfType<TextBox>()
             where control.Name.StartsWith("box")
             select Convert.ToInt32(control.Text);
}
11
ответ дан 18 December 2019 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: