Наилучший эффективный способ вычисления вхождений значений во вложенных структурах и обновления самих структур

#c# #performance #linq

Вопрос:

Каков наилучший эффективный способ вычисления вхождений значения во вложенной структуре, а затем обновления самой структуры?

Фактические структуры более сложны, но для простоты представьте, что это структуры:

 public class MainStructure
{
   public string name { get; set; }
   public List<SubStructure> subStructure { get; set; }
}

public class SubStructure
{
   public string name { get; set; }
   public string value { get; set; }
   public int occurrences { get; set; }
}
 

Дополнительная информация: для каждой основной конструкции ПодСтруктура имеет 10 различных названий и всегда находится в одном и том же положении. Другими словами, 1-й SubStructure.name всегда будет, например, «Материальным». Второй SubStructure.name всегда будет «Цветной» и т. Д…

Теперь в моем коде у меня есть список var allStructures = List<MainStructure>() с 5000 записями в списке. Каждая из основных конструкций имеет 10 подструктур. Я пытаюсь вычислить, сколько раз значение в ПодСтруктуре встречается во всех 5000 основных структурах, и обновить свойство вхождения в подструктуре. Например, если у меня есть основная структура, в которой значение 1-й подструктуры встречается 300 раз, я бы идеально удалил все эти 300 в подструктуре.вхождения = 300.

Я думал о вложенных предустановках как в основной структуре, так и в подструктуре с помощью «если», чтобы увидеть, уже ли вычислено свойство вхождений, чтобы пропустить его, если это конкретное значение уже найдено, но я сомневаюсь, что это наилучший эффективный способ достижения того, что я пытаюсь сделать.

Спасибо!

Комментарии:

1. У вас есть какие-то веские причины occurrences , по которым вам нужно быть внутри SubStructure ?. Это кажется немного неэффективным и проблемой разделения забот. Не могли бы вы сохранить информацию где-нибудь в словаре или использовать другой подход?

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

3. @Общая причина наличия occurrences внутри подструктуры заключается в том, что необходимо провести дальнейший анализ (например, ранг) самой основной структуры. Основная структура обладает свойствами, которые представляют собой вычисление значений occurrences для всех ее подструктур. Имеет ли это смысл? Если есть другое предложение по реализации той же идеи, я был бы рад переписать его. Упрощение: Основная структура обладает свойством, представляющим собой сумму всех вхождений всех ее подструктур, и тогда я могу ранжировать основную структуру (структуры).

4. Можем ли мы предположить, что подструктура имеет отношение FK, подобное отношению MainStructureId?

5. @Deniz в настоящее время у него нет FK. Все это в памяти. Обработка всего с помощью запросов Linq…