У меня есть коллекция объектов и вы хотите изменить свойство объекта в этой коллекции. Если у меня есть один объект, мой метод ChangeStuff
работает нормально, и объект возвращается при возврате из метода. (Первые 4 строки в Main)Изменение свойства объекта в коллекции
Однако при повторении через коллекцию, я думаю, что я что-то упускаю, поскольку мои измененные значения, похоже, застревают в области цикла foreach.
Мне не нужно было передавать объекты by ref (или используя параметр out), так как я не возвращаю новое значение.
Извините за большой кусок кода, но он настолько упрощен, насколько я могу это сделать и все еще демонстрирую свою проблему.
class foobar
{
public string string1;
public string string2;
}
static void Main(string[] args)
{
/***** THIS WORKS!! *****/
foobar singleFb = new foobar { string1 = "foo2", string2 = "bar2" };
ChangeStuff(singleFb);
Console.WriteLine(singleFb.string1 + ", " + singleFb.string2);
Console.ReadLine(); //pause to read output
/***** THIS DOESN'T WORK!! *****/
List<foobar> myList = new List<foobar> { new foobar {string1 = "foo1", string2 = "bar1"}, new foobar {string1 = "foo2", string2 = "bar2"}, new foobar {string1 = "something else", string2 = "something else again"} };
IEnumerable<foobar> fbs = myList.Where(x => x.string1.StartsWith("foo"));
ChangeStuff(fbs);
foreach (foobar fb in fbs)
{
Console.WriteLine(fb.string1 + ", " + fb.string2);
}
Console.ReadLine(); //pause to read output
}
static void ChangeStuff(IEnumerable<foobar> fbs)
{
foreach (foobar fb in fbs)
{
ChangeStuff(fb);
}
}
static void ChangeStuff(foobar fb)
{
if (fb.string1.Contains("2"))
fb.string1 = "changed!";
}
}
Что мне нужно изменить, чтобы изменить объект в коллекции?
Edit: Кроме того, только заметил, что моя коллекция на самом деле полностью отсутствует "foo2", когда он возвращается ... Weird. Я фактически использую IQueryable в своем приложении и не испытывал этой проблемы. то есть. У меня есть все объекты, они просто неправильно изменены. Не уверен, что здесь происходит ...
Edit 2: Спасибо за ваши ответы, это имеет смысл сейчас. Если бы я изменить свой
ChangeStuff
метод следующим образом, она работает, как я бы ожидать:
static void ChangeStuff(foobar fb)
{
if (fb.string2.Contains("2"))
fb.string2 = "changed!";
}
Является ли «foobar» структурой? Пожалуйста, напишите краткий, но полный пример кода, который надежно демонстрирует проблему. –
@PeterDuniho, извините, я пропустил копирование класса. См. Править. –