imeyal0 Ответов: 2

Свойство списка< & gt; не обновляется


У меня есть этот код ниже:
Foood[] food = new Foood[types];
            food[0] = new Foood("protein", 2.0);
            food[1] = new Foood("vitamins", 3.0);
            food[2] = new Foood("Carbonhydrate", 4.0);

а потом это
List<Foood> foods = new List<Foood>();

     foods.Add(food[0]);
     foods.Add(food[1]);
     foods.Add(food[2]);



а потом это
for (int i = 0; i < days; i++)
{

    UpdateCalories(foods);

}



public void UpdateCalories(List<Foood> foodItem)
        {

            for (int i = 0; i < foodItem.Count; i++)
            {
                foodItem[i].calories = foodItem[i].calories + 1.1;
            }
        }


я хочу иметь возможность иметь значения для разных дней перед печатью

Что я уже пробовал:

Я написал и вставил код
got this:
Day0
protein,5.3
vitamins,6.3
Carbonhydrate,7.3

Day1
protein,5.3
vitamins,6.3
Carbonhydrate,7.3

Day2
protein,5.3
vitamins,6.3
Carbonhydrate,7.3

Day3
protein,5.3
vitamins,6.3
Carbonhydrate,7.3
----------------------------------------

Но я хочу этого:
Day0
protein,2.0
vitamins,3.0
Carbonhydrate,4.0

Day1
protein,3.1
vitamins,4.1
Carbonhydrate,5.1

Day2
protein,4.2
vitamins,5.2
Carbonhydrate,6.2

Day3
protein,5.3
vitamins,6.3
Carbonhydrate,7.3

-----------------

Я все еще хочу иметь доступ к значениям предыдущих дней, а не только к последнему дню.

это мой выходной код
----------------------------
using (StreamWriter sw = new StreamWriter(@"U:\Food\food.txt"))
{
	sw.WriteLine("Day" + "{0}", 0);
	for (int ii = 0; ii < types; ii++)
	{
		sw.WriteLine("{0},{1}", food[ii].Type, food[ii].Calories);
	}
	sw.WriteLine("");
	for (int i = 0; i < days; i++)
	{
		{
			sw.WriteLine("Day" + "{0}", i + 1);
			for (int ii = 0; ii < types; ii++)
			{
				sw.WriteLine("{0},{1}", food[ii].Type, food[ii].Calories);
			}
			sw.WriteLine("");
		}
	}
}

CHill60

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

[no name]

Вам уже сказали, что делать. Немного логического мышления вам поможет. Если вы обновите все свои объекты одновременно,что еще вы ожидаете?

imeyal0

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

j snooze

ну, я не вижу, что делает ваш UpdateCalories, но если у вас нет метода под названием updatecalories, я бы сказал, что это ваша проблема. Кроме того, ваш код должен быть написан, чтобы быть более ремонтопригодным. Где у вас есть
продукты.Добавить (еда[0]);
продукты.Добавить (еда[1]);
продукты.Добавить (еда[2]);
что происходит, когда есть 50 видов пищи? вы собираетесь написать 50 строк кода и перекомпилировать их для каждого добавленного типа пищи?
Так и должно быть
для (int i=0; i<food.длина; i++){
продукты.Добавить (еда[i]);
}
если вышесказанное-всего лишь пример, это прекрасно, но если вы планируете сделать из этого настоящее приложение, я настоятельно рекомендую цикл for .

imeyal0

updatecalories есть.
да..Это всего лишь образец.
пожалуйста, помогите и помогите. Я также пытался обновить в разные дни, но результат один и тот же

Patrice T

Какой результат вы получаете ?
Какой выход вы хотите ?

imeyal0

получить это:
День0
белок, 5,3
витамины,6,3
Углекислый газ, 7,3

День1
белок, 5,3
витамины,6,3
Углекислый газ, 7,3

День2
белок, 5,3
витамины,6,3
Углекислый газ, 7,3

День 3
белок, 5,3
витамины,6,3
Углекислый газ, 7,3
----------------------------------------
Но я хочу этого:
День0
белок, 2,0
витамины, 3,0
Углекислый газ, 4,0

День1
белок, 3,1
витамины, 4,1
Углекислый газ, 5.1

День2
белок, 4,2
витамины, 5,2
Карбонатный гидрат, 6,2

День 3
белок, 5,3
витамины,6,3
Углекислый газ, 7,3

-----------------
Я все еще хочу иметь доступ к значениям предыдущих дней, а не только к последнему дню.

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

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

imeyal0

Я добавил код

imeyal0

Я использовал его - и дал тот же неправильный результат, что и раньше.

imeyal0

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

imeyal0

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

Patrice T

Для обсуждения решения используйте кнопку" есть вопрос или комментарий? " в нижней части решения.
Ему легче следовать.

imeyal0

Здравствуйте, пожалуйста, как мне отправить выходные данные в файл Excel/CSV вместо текстового файла? Пожалуйста, помогите.

Patrice T

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

j snooze

а ... теперь я понимаю, в чем дело. Если вы передаете этот список другому методу, то по умолчанию используется byval (или просто его копия), поэтому вы обновляете только переменную "handed off to" в методе Updatecalories. Вы можете сделать это 2 способами, но вам все равно придется придумать способ хранения списка для каждого отдельного дня, если только я не неправильно понимаю, что вы пытаетесь сделать, потому что это не совсем ясно.

Либо передайте список byref, чтобы ваш метод должен был быть определен как
(Решение 1)
public void UpdateCalories(byref List<foood> foodItem){
//// сохранить текущий код
}

Или
(Решение 2)
общественная список<foood&ГТ; UpdateCalories(список<foood&ГТ; foodItem)
{

for (int i = 0; i < foodItem.Граф; i++)
{
foodItem[я].калорий = foodItem[я].калорий + 1.1;
}

вернуть foodItem;
}

затем ваш цикл for, вызывающий метод, должен будет сделать это

for (int i = 0; i < days; i++)
{

foods = UpdateCalories(продукты питания);

}

j snooze

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

imeyal0

Я уже пробовал решение 2, но оно не сработало. Кроме того, я храню каждый день в списке списка.

Я попробую Решение 1 сейчас и вернусь как можно скорее.

imeyal0

я получил тот же результат
День0
белок, 5,3
витамины,6,3
Углекислый газ, 7,3

День1
белок, 5,3
витамины,6,3
Углекислый газ, 7,3

День2
белок, 5,3
витамины,6,3
Углекислый газ, 7,3

День 3
белок, 5,3
витамины,6,3
Углекислый газ, 7,3

но я хочу этого:
---------------------------
Но я хочу этого:
День0
белок, 2,0
витамины, 3,0
Углекислый газ, 4,0

День1
белок, 3,1
витамины, 4,1
Углекислый газ, 5.1

День2
белок, 4,2
витамины, 5,2
Карбонатный гидрат, 6,2

День 3
белок, 5,3
витамины,6,3
Углекислый газ, 7,3

imeyal0

используя (модулю записи StreamWriter ео = новая модулю записи StreamWriter(@"U:\Food\food.txt"))
{


//ув.Метода WriteLine("");


for (int i = 0; i < days; i++)
{

{
sw. WriteLine ("День" + " {0}", i + 1);

for (int ii = 0; ii < types; ii++)
{

ув.Метода WriteLine("{0},{1}", foodDays[я].продукты питания[ИИ].Типа, foodDays[я].продукты питания[ИИ].Калорий);

}
ув.Метода WriteLine("");
}


}

}

imeyal0

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

2 Ответов

Рейтинг:
1

j snooze

public class Foood
       {
           public string Type { get; set; }
           public double Calories { get; set; }

           public Foood(string type, double calories)
           {
               Type = type;
               Calories = calories;
           }
       }

       public class Days
       {
          public List<Foood> foods = new List<Foood>();
       }

       private void testit()
       {
           int types = 3;
           List<Foood> foods = new List<Foood>();
           List<Days> foodDays = new List<Days>();
           int days = 3;


           Foood[] food = new Foood[types];
           food[0] = new Foood("protein", 2.0);
           food[1] = new Foood("vitamins", 3.0);
           food[2] = new Foood("Carbonhydrate", 4.0);

           for (int i = 0; i < food.Length; i++)
           {
               foods.Add(food[i]);
           }

           Days day = new Days();
           day.foods = foods;
           foodDays.Add(day);

           for (int i = 1; i <= days; i++)
           {
               day = new Days();
               day.foods = UpdateCalories(foodDays[i-1].foods);
               foodDays.Add(day);
           }

       }

       public List<Foood> UpdateCalories(List<Foood> foodItem)
       {
           List<Foood> newFood = new List<Foood>();
           Foood item;

           for (int i = 0; i < foodItem.Count; i++)
           {
               item = new Foood(foodItem[i].Type, foodItem[i].Calories + 1.1);
               newFood.Add(item);
           }

           return newFood;
       }
   }


imeyal0

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

Рейтинг:
1

Patrice T

попробуйте этот код

using (StreamWriter sw = new StreamWriter(@"U:\Food\food.txt"))
{
	for (int i = 0; i < days; i++)
	{
		sw.WriteLine("Day" + "{0}", i);
		for (int ii = 0; ii < types; ii++)
		{
			sw.WriteLine("{0},{1}", food[ii].Type, food[ii].Calories);
		}
		sw.WriteLine("");
		//	UpdateCalories here
	}
}


[Обновление]
Другой способ увидеть проблему-это:
день 0, используйте хорошие значения
день 1, используйте хорошие значения + 1.1
день 2, используйте хорошие значения + 1.1 * 2
день 3, используйте хорошие значения + 1.1 * 3
...
и вы не меняете пищевые ценности.
sw.WriteLine("{0},{1}", food[ii].Type, food[ii].Calories + 1.1 * i);


imeyal0

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

imeyal0

Я думаю, что помощь, в которой я нуждаюсь, состоит в том, чтобы иметь возможность работать с дубликатом объекта от одного дня к другому, не изменяя / не изменяя изменяющийся исходный объект

imeyal0

пожалуйста, любезно помогите - представление конструктора для формы 1 в CSharp Visual Studio 2015 отсутствует. Он появляется только тогда, когда я нажимаю кнопку "Пуск". Пожалуйста, как мне вернуть его обратно, чтобы отредактировать форму.
Я думаю, что он пропал без вести при копировании с одной версии VS на другую и использовании разных компьютеров.

Patrice T

Я помогал тебе в том, что знаю.
Я не против

imeyal0

Большое спасибо. Я действительно ценю.