System.InvalidOperationException: 'Collection 已被修改;枚举操作可能无法执行。



我试图实现https://learn.microsoft.com/en-us/dotnet/standard/events/observer-design-pattern到我的宠物店为学校的项目。然而,我一直遇到这个错误。我已经尝试过查找它,但最常见的解决方案,如。tolist ();或ToArray ();不工作。

我的观察者类:

namespace Weekopdracht_College1
{
class ObservableStore : IObservable<Animal>
{
private List<IObserver<Animal>> observers;
private List<Animal> animals; 
public ObservableStore()
{
observers = new List<IObserver<Animal>>();
animals = new List<Animal>();
}
public IDisposable Subscribe(IObserver<Animal> observer)
{
if (! observers.Contains(observer))
{
observers.Add(observer); 
foreach(var item in animals)
{
observer.OnNext(item); 
}
}
return new Unsubscriber<Animal>(observers, observer); 
}
public void AddAnimal(int id)
{
AddAnimal(id, String.Empty, 0, 0); 
}

public void AddAnimal(int id, string type, double price, int stock)
{
var info = new Animal(id, type, price, stock);
if (stock > 0 && ! animals.Contains(info))
{
animals.Add(info); 
foreach (var observer in observers)
{
observer.OnNext(info); 
}
}
else if (stock == 0)
{
var animalsToRemove = new List<Animal>(); 
foreach(var animal in animals) 
{
if(info.AnimalId == animal.AnimalId)
{
animalsToRemove.Add(animal); 
foreach (var observer in observers)
{
observer.OnNext(info); 
}
}
foreach (var animalToRemove in animalsToRemove)
{
animals.Remove(animalToRemove);


}
animalsToRemove.Clear();
}
}
}
public void LastAnimalBought()
{
foreach (var observer in observers)
{
observer.OnCompleted(); 
}
observers.Clear(); 
}
}

}

这部分不工作:

else if (stock == 0)
{
var animalsToRemove = new List<Animal>(); 
foreach(var animal in animals) <--- Error point
{
if(info.AnimalId == animal.AnimalId)
{
animalsToRemove.Add(animal); 
foreach (var observer in observers)
{
observer.OnNext(info); 
}
}
foreach (var animalToRemove in animalsToRemove)
{
animals.Remove(animalToRemove);


}
animalsToRemove.Clear();
}
}

动物类:

public class Animal
{
private int id { get; set; }
private string type { get; set; }
private double price { get; set; }
private int stock { get; set; }
internal Animal(int id, string type, double price, int stock)
{
this.id = id; 
this.type = type;
this.stock = stock;
this.price = price; 
}
public int AnimalId
{
get { return this.id;  }
}
public string AnimalType {
get { return this.type; }
}
public double AnimalStock
{
get { return this.stock; }
}
public double AnimalPrice { 
get { return this.price; }
}
}

显示类:

namespace Weekopdracht_College1
{
class StockScreen : IObserver<Animal>
{
private string name;
private List<string> animalInfos = new List<string>();
private IDisposable cancellation;
private string fmt = "{0,-20} {1,5} {2, 3} {3,4}"; 
public StockScreen(string name)
{
if (String.IsNullOrEmpty(name))
{
throw new ArgumentNullException("The observer must be assigned a name."); 
}
this.name = name; 
}
public virtual void Subscribe(ObservableStore provider)
{
cancellation = provider.Subscribe(this); 
}
public virtual void Unsubscribe()
{
cancellation.Dispose();
animalInfos.Clear(); 
}
public virtual void OnCompleted()
{
animalInfos.Clear();
}
public virtual void OnError(Exception e)
{
// no implementation
}
public virtual void OnNext(Animal info)
{
bool updated = false; 
if (info.AnimalStock == 0)
{
var animalsToRemove = new List<string>();
string name = String.Format("{0,5}", info.AnimalId); 
foreach(var animalInfo in animalInfos)
{
if (animalInfo.Substring(21, 5).Equals(name))
{
animalsToRemove.Add(animalInfo); 
}
animalsToRemove.Clear(); 
}
}
else
{
string animalInfo = String.Format(fmt, info.AnimalId, info.AnimalType, info.AnimalPrice, info.AnimalStock); 
if (! animalInfos.Contains(animalInfo))
{
animalInfos.Add(animalInfo);
updated = true; 
}
}
if(updated)
{
animalInfos.Sort();
Console.WriteLine("Animal information from: {0}", this.name); 
foreach (var animalInfo in animalInfos)
{
Console.WriteLine(animalInfo); 
}
Console.WriteLine(); 
}
}
}
}

animalsToRemove上的循环移出animals上的foreach循环:

var animalsToRemove = new List<Animal>(); 
foreach(var animal in animals) <--- Error point
{
if(info.AnimalId == animal.AnimalId)
{
animalsToRemove.Add(animal); 
foreach (var observer in observers)
{
observer.OnNext(info); 
}
}         
}
foreach (var animalToRemove in animalsToRemove)
{
animals.Remove(animalToRemove);
}
animalsToRemove.Clear();

最新更新