Найти ошибку в коде
Условие задачи
Дан класс FlatteningService. У него имеются свойства, среди которых ProductDictionary<string, IList<T>> и CustomerDictionary<string, IList<T>>, а также метод MakeFlatten, внутри которого происходит обращение к этим свойствам на чтение/изменение. В процессе работы программы во время вызова этого метода могут возникать ошибки KeyNotFoundException и подобные. Дополнительные вводные: в процессе работы создаётся один экземпляр класса FlatteningService, но вызов метода MakeFlatten осуществляется параллельно в 10 потоках. Найти ошибку в коде
csharppublic class FlatteningService
{
private readonly Dictionary<string, IList<FlattenLocationFilter>> locationFilters;
public PromoFlatteningService()
{
locationFilters = new Dictionary<string, IList<FlattenLocationFilter>>();
}
public IEnumerable<FlattenPromo> MakeFlatten(IEnumerable<OraclePromo> items)
{
var itemsList = items.ToLookup(x => x.PromoCode);
var flatList = new List<FlattenPromo>();
foreach (var src in itemsList.Single())
{
var promoCode = $"{src.PromoCode}";
const string locationFilter = "Auchan";
if (!locationFilters.ContainsKey(locationFilter))
{
// выходит ошибка, что ключ уже существует
locationFilters.Add(locationFilter, new List<FlattenLocationFilter>
{
new()
{
FilterCode = locationFilter,
FilterOperator = "AND",
CriteriaCode = "Location",
CriteriaOperator = "OR",
ExpectedValue = "Auchan",
ExpectedOperator = "EQ",
FilterDescription = "none",
LocationPropertyCode = "none"
}
});
flatlist.Add(new FlattenPromo
{
PromoCode = promoCode,
PromoBegin = src.StartDate.ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc),
PromoEnd = src.EndDate.ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc),
LocationFilterCode = locationFilter,
LocationFilter = locationFilters[locationFilter], // выходит ошибка keyNotFoundException
ProductCode = src.ProductId,
ProductDiscountPercent = src.DiscountPercent,
ProductPlanQuantity = src.PlanSum,
});
}
}
}
}