Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > В цикле не изменяет значения.


Автор: MasterOfCode 28.4.2008, 15:15

Код

cLine line;
List<cLine> lines = new List<cLine>();
//заполняю lines
foreach (string readLine in header)
{
    lines.Add(new cLine(readLine));
}
int index = 0;
//меняю местами значения.
foreach (cLine line in lines)
{
    if (line.Name != "STRT" && line.Name != "STOP")
    {
        lines[index].Value = line.Сomments; //не меняет значения - lines[index].Value
        lines[index].Сomments = line.Value; //не меняет значения - lines[index].Сomments 
    }
    index++;
}

- кусок кода в программе.

кусок кода в классе:

Код

class cLine
{

//...

    public string Value
    {
        get { return this.value; }
        set { this.value = Value; }
    }
    public string Сomments
    { 
        get { return this.comments; }
        set { this.comments = Сomments; }
    }

//...

}


почему-то не меняет значения в цикле? Почему?

Автор: mr.DUDA 28.4.2008, 15:27
Код
    public string Value
    {
        get { return this.value; }
        set { this.value = Value; } // <---------- вот тут ошибка !!!!!!!!!!!
    }
    public string Сomments
    { 
        get { return this.comments; }
        set { this.comments = Сomments; } // <---------- и здесь такая же !!!!!!!!!!!
    }

В чём именно ошибка, сказать?  smile 

Автор: fantast 28.4.2008, 17:29
index у тебя начинается с 0, и foreach'ем ты идешь с первого элемента, тоесть вот в этих строках
Код

lines[index].Value = line.Сomments;
lines[index].Сomments = line.Value;

lines[index] и есть line, и ты сначала Сomments записываешь в Value, а потом новое значение Value опять записываешь в Сomments, логики тут нет это точно, потому что этим ты делаешь так, чтобы значение Сomments лежало еще и в Value; если ты этим хотел поменять значения местами то делай это через 3юю переменную, а если хотел чтоб Value равнялся Сomments, то вторая строка лишняя

возможго из-за этого

Добавлено через 1 минуту и 16 секунд
и судя по всему ты хотел внести 
Код

index++;

эту строку в тело цикла

Автор: mr.DUDA 28.4.2008, 17:37
Там не только этот баг, есть ещё один. Раз уж никто не нашёл ошибку, объясняю:
Код
    public string Value
    {
        get { return this.value; }
        set { this.value = Value; }
    }

    public string Сomments
    { 
        get { return this.comments; }
        set { this.comments = Сomments; }
    }


заменяем на:
Код
    public string Value
    {
        get { return this.value; }
        set { this.value = value; }
    }

    public string Сomments
    { 
        get { return this.comments; }
        set { this.comments = value; }
    }



Собственно, сеттер свойств принимает новое значение через ключевое слово value, а в первоначальном коде свойству переприсваивалось его же значение (имя свойства с большой буквы).

Автор: fantast 28.4.2008, 17:43
mr.DUDA, чел написал
Цитата

почему-то не меняет значения в цикле? Почему?

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

а так разумеется ты прав.


Автор: MasterOfCode 28.4.2008, 19:00
Возникли такие вопросы:
Оператор foreach начинает брать значения с первого элемента, а не с нулевого? (Очень сомнительно, т.к. я же начинаю с 0 элемента и в режиме отладчика проверяю lines[index].Value и line.Value имеют одинаковое значение)

в цикле foreach (cLine line in lines)
в line пойдет указатель на запись в lines? Т.о. можно просто менять line и в "массиве" будут синхронно происходить изменения?

Спасибо mr.DUDA, не знал что сеттер таким образом устанавливается через маленькое value. smile
Всем спасибо.

Добавлено @ 19:06
Цитата(fantast @ 28.4.2008,  17:29)
и судя по всему ты хотел внести 
Код

index++;

эту строку в тело цикла

Прости, но помоему index++ в теле цикла. smile

Автор: mr.DUDA 28.4.2008, 19:46
Цитата(MasterOfCode @  28.4.2008,  19:00 Найти цитируемый пост)
Оператор foreach начинает брать значения с первого элемента, а не с нулевого?

С нулевого, и всё в цикле правильно (за исключением перестановки местами - нужна промежуточная переменная).

Автор: Dennnis 28.4.2008, 20:03
Цитата(MasterOfCode @  28.4.2008,  19:00 Найти цитируемый пост)
в line пойдет указатель на запись в lines? Т.о. можно просто менять line и в "массиве" будут синхронно происходить изменения?

smile 
Вобщем так должно быть
Код

cLine line;
List<cLine> lines = new List<cLine>();
//заполняю lines
foreach (string readLine in header)
{
    lines.Add(new cLine(readLine));
}
int index = 0;
//меняю местами значения.
foreach (cLine line in lines)
{
    if (line.Name != "STRT" && line.Name != "STOP")
    {
        string tmp = line.Value;
        line.Value = line.Сomments;
        line.Сomments = tmp;
    }
}

class cLine
{
//...
    public string Value
    {
        get { return this.value; }
        set { this.value = value; }
    }
    public string Сomments
    { 
        get { return this.comments; }
        set { this.comments = value; }
    }
//...
}

Автор: fantast 29.4.2008, 10:38
блин совсем мозг мой отключился, писал как поэму не задумываясь о таких деталях 8)

Цитата(MasterOfCode @  28.4.2008,  19:00 Найти цитируемый пост)
Прости, но помоему index++ в теле цикла. smile

конечно ты прав, а я имел ввиду в тело if, таким образом получается, что мы пройдем по массиву, затирая эллементы 
Цитата
line.Name != "STRT" && line.Name != "STOP"

8)
Цитата(MasterOfCode @  28.4.2008,  19:00 Найти цитируемый пост)
Оператор foreach начинает брать значения с первого элемента, а не с нулевого?

Цитата(mr.DUDA @  28.4.2008,  19:46 Найти цитируемый пост)
С нулевого

разумеется, еще раз сорри

Автор: MasterOfCode 29.4.2008, 20:00
Тема закрыта. smile Всем спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)