public ExperimentRunNameGroup AddGroup(String _name, String _description, String _runNames, Int32 _priority = 100)
        {
            ExperimentRunNameGroup group = new ExperimentRunNameGroup();

            group.Priority = _priority;
            group.Deploy(_name, _description, _runNames);
            groups.Add(group);
            return(group);
        }
        /// <summary>
        /// Deploys for run names.
        /// </summary>
        /// <param name="runs">The runs.</param>
        /// <returns></returns>
        public ExperimentRunNameGroup DeployForRunNames(List <String> runs)
        {
            ExperimentRunNameGroup output = new ExperimentRunNameGroup();

            output.name        = name;
            output.description = description;
            output.Priority    = Priority;
            output.runNames.AddRange(runs);
            return(output);
        }
        /// <summary>
        /// Returns clone filtered for matched runNames
        /// </summary>
        /// <param name="runNames">The run names.</param>
        /// <returns></returns>
        public ExperimentRunNameGroups DeployForRunNames(IEnumerable <String> runNames, params String[] runNameSuffixes)
        {
            ExperimentRunNameGroups output = new ExperimentRunNameGroups();

            List <String> names = runNames.ToList();

            List <String> suffixes = new List <string>();

            if (runNameSuffixes != null)
            {
                suffixes.AddRange(runNameSuffixes);
            }

            List <String> assigned = new List <string>();

            foreach (ExperimentRunNameGroup group in groups)
            {
                List <String> in_group = new List <string>();

                foreach (var in_name in names)
                {
                    if (group.runNames.Contains(in_name))
                    {
                        in_group.Add(in_name);
                    }
                    else
                    {
                        foreach (String suffix in suffixes)
                        {
                            if (in_name.EndsWith(suffix))
                            {
                                String in_name_nosuffix = in_name.Substring(0, in_name.Length - suffix.Length);

                                if (group.runNames.Contains(in_name_nosuffix))
                                {
                                    in_group.Add(in_name);
                                }
                            }
                        }
                    }
                }

                if (in_group.Any())
                {
                    assigned.AddRange(in_group);
                    output.groups.Add(group.DeployForRunNames(in_group));
                }

                //foreach (var nm in group.runNames)
                //{

                //}


                //List<string> runs = names.Intersect(group.runNames).ToList();


                //if (runs.Any())
                //{
                //    assigned.AddRange(runs);
                //    output.groups.Add(group.DeployForRunNames(runs));
                //}
            }

            foreach (String ass in assigned)
            {
                names.Remove(ass);
            }

            if (names.Any())
            {
                ExperimentRunNameGroup otherGroup = new ExperimentRunNameGroup();
                otherGroup.name        = "Other";
                otherGroup.description = "Ungrouped experiment runs";
                otherGroup.runNames.AddRange(names);
                otherGroup.Priority = -100;
                output.groups.Add(otherGroup);
            }

            output.groups.OrderByDescending(x => x.Priority);

            return(output);
        }