private void CheckNutzwertPerKatOk()
        {
            var raume = NewRaume.Select(x => x).ToList();

            raume.AddRange(UpdRaume);
            CheckNutzwertPerKatOk(raume);
        }
 private void ClearAll()
 {
     _dbKatDict.Clear();
     NewKats.Clear();
     DelKats.Clear();
     _raumDict.Clear();
     UpdRaume.Clear();
     DelRaume.Clear();
     NewRaume.Clear();
     WohnungRecords.Clear();
     InvalidCategories.Clear();
     ChangedRaumRecords.Clear();
     NrOfChangedRaumRecords = 0;
 }
        public void Update(List <IBlockInfo> blockInfos, List <IWohnungInfo> wohnungInfos, IProjektInfo projektInfo, IPariDatabase database)
        {
            ClearAll();

            var projektId = GetProjektId(projektInfo, database);

            GetWohnungRecords(wohnungInfos, projektId);

            // Kategorien aus Datenbank
            GetKategoriesFromDatabase(database, projektId);

            // AutoCAD-Blockinfo
            var blockInfoDict = new Dictionary <string, IBlockInfo>();

            foreach (var blockInfo in blockInfos)
            {
                blockInfoDict[blockInfo.Handle] = blockInfo;
            }

            // Räume aus Datenkbank
            var dbRaume = database.GetRaeume(projektId);

            // Ermitteln der zu löschenden Räume
            foreach (var raumRecord in dbRaume)
            {
                _raumDict[raumRecord.AcadHandle] = raumRecord;
                if (!blockInfoDict.ContainsKey(raumRecord.AcadHandle))
                {
                    DelRaume.Add(raumRecord);
                }
            }

            // updRaume und newRaume
            foreach (var blockInfo in blockInfos)
            {
                IRaumRecord raumRecord;
                if (_raumDict.TryGetValue(blockInfo.Handle, out raumRecord))
                {
                    UpdRaume.Add(raumRecord);
                    var rr2 = raumRecord.ShallowCopy();
                    raumRecord.UpdateValuesFrom(blockInfo);
                    if (!raumRecord.IsEqualTo(rr2))
                    {
                        ChangedRaumRecords.Add(raumRecord);
                        NrOfChangedRaumRecords++;
                    }
                }
                else
                {
                    raumRecord           = _factory.CreateRaumRecord();
                    raumRecord.ProjektId = projektId;
                    NewRaume.Add(raumRecord);
                    raumRecord.UpdateValuesFrom(blockInfo);
                }

                IKategorieRecord kat;
                if (!_dbKatDict.TryGetValue(raumRecord.KatIdentification, out kat))
                {
                    kat           = _factory.CreateKategorie(raumRecord);
                    kat.ProjektId = projektId;
                    NewKats.Add(kat);
                    raumRecord.Kategorie = kat;
                    _dbKatDict.Add(raumRecord.KatIdentification, kat);
                }
                else
                {
                    if (!CompareNutzwert(raumRecord.Nutzwert, kat.Nutzwert))
                    {
                        // create kat because of rnw-handling
                        var tmpkat = _factory.CreateKategorie(raumRecord);
                        kat.RNW      = tmpkat.RNW;
                        kat.Nutzwert = tmpkat.Nutzwert;
                        UpdKats.Add(kat);
                    }
                    DelKats.Remove(kat);
                }

                raumRecord.Kategorie = kat;
            }

            CheckNutzwertPerKatOk();
        }