private void AddRule(MatchingRule ruleToAdd) { if (ruleToAdd == null) { throw new ArgumentNullException(nameof(ruleToAdd)); } if (string.IsNullOrWhiteSpace(this.rulesStorageKey)) { throw new InvalidOperationException("Unable to add a matching rule at this time, the service has not yet loaded a matching rule set."); } // Make sure no rule already exists with this id: if (MatchingRules.Any(r => r.RuleId == ruleToAdd.RuleId)) { throw new DuplicateNameException($"Unable to add new matching rule: Rule ID {ruleToAdd.RuleId} already exists in the collection."); } // Check to see if an existing group object for the desired bucket already exists. var existingGroup = MatchingRulesGroupedByBucket.FirstOrDefault(group => group.Bucket == ruleToAdd.Bucket); if (existingGroup == null) { // Create a new group object for this bucket. var addNewGroup = new RulesGroupedByBucket(ruleToAdd.Bucket, new[] { ruleToAdd }); this.matchingRulesGroupedByBucket.Add(addNewGroup); this.matchingRules.Add(ruleToAdd); } else { // Add to existing group object. if (existingGroup.Rules.Contains(ruleToAdd)) { this.logger.LogWarning(l => "Attempt to add new rule failed. Rule already exists in Grouped collection. " + ruleToAdd); return; } existingGroup.Rules.Add(ruleToAdd); if (MatchingRules.Contains(ruleToAdd)) { this.logger.LogWarning(l => "Attempt to add new rule failed. Rule already exists in main collection. " + ruleToAdd); return; } this.matchingRules.Add(ruleToAdd); } this.logger.LogInfo(_ => "Matching Rule Added: " + ruleToAdd); }