2016-12-19 2 views
0

У меня есть ребенок действие со следующим фрагментом кода:Child действия - добавление нескольких элементов в

public ActionResult MyAction() 
{ 
    var models = GetModelsFromDb(); 
    var counts = new Dictionary<int, int>(); 

    foreach (var model in models) 
     if (!counts.ContainsKey(model.Id)) 
      counts.Add(model.Id, 0); 

    return View(count); 
} 

Проблема заключается в том, что ... Add иногда бросает An item with the same key has already been added. исключения. Может быть проблема параллелизма? Я не думаю, так как код находится в дочернем действии, а словарь - это локальная переменная.

+0

Вопрос: это возможно, что «модель» может присутствовать в два раза по любой причине, когда НУ получить от вашего метода GetModelsFromDb? Edit1: Вы можете добавить реализацию GetModelsFromDBb(), если возможно – OrcusZ

+0

Да, поэтому я делаю проверку перед добавлением элемента в словарь. – pwas

+0

Хорошо, я напишу ответ – OrcusZ

ответ

2

После ответа, пожалуйста изменить реализацию в GetModelsFromDb(), чтобы получить только отдельные элементы:

Вы можете сделать это, таким образом, с помощью LINQ:

myList.GroupBy(x => x.id) 
     .Select(g => g.First()); 

После этого, вы можете быстро подсчитать ваши данные, как это:

var counts = models.Count(); 

Редактировать 1:

Если вы не можете по каким-либо причинам сделать отчетливый в методе:

var counts = models.Select(m => m.id).Distinct().Count() 
+1

Хорошо, я знаю, как изменить код, чтобы он работал. Мне более любопытно, почему он не работает по сценарию, как я писал. В многопоточном случае - я знаю, что проблема имеет место. Но нет никакой возможности, чтобы два потока обращались к локальной переменной в фрагменте, подобном этому. – pwas

+0

Я думаю, что что-то не так с containsKey, что здесь есть какое-то совпадение. Но какая-то черная магия делает то, что мы не можем понять ^^ – OrcusZ

Смежные вопросы