public static PropertyFindResult FindExistingElements(this Project project, params string[] names)
        {
            var result = new PropertyFindResult
            {
                OtherUnconditionalElements = new List <XElement>(),
                OtherConditionalElements   = new List <XElement>()
            };

            foreach (var name in names)
            {
                var(unconditional, conditional) = project.PropertyAll(name);
                foreach (var child in unconditional)
                {
                    Store(child, ref result.LastUnconditionalElement, result.OtherUnconditionalElements);
                }

                foreach (var(_, child) in conditional)
                {
                    Store(child, ref result.LastConditionalElement, result.OtherConditionalElements);
                }
            }

            return(result);

            void Store(XElement child, ref XElement lastElement, IList <XElement> others)
            {
                if (lastElement != null)
                {
                    if (child.IsAfter(lastElement))
                    {
                        others.Add(lastElement);
                        lastElement = child;
                    }
                    else
                    {
                        others.Add(child);
                    }
                }
                else
                {
                    lastElement = child;
                }
            }
        }
 public static IEnumerable <XElement> All(this PropertyFindResult self)
 {
     return(self.LastElementIsConditional
                         ? self.AllConditional().Concat(self.AllUnconditional())
                         : self.AllUnconditional().Concat(self.AllConditional()));
 }
 public static IEnumerable <XElement> AllConditional(this PropertyFindResult self)
 {
     return(self.LastConditionalElement != null
                         ? self.OtherConditionalElements.Concat(new[] { self.LastConditionalElement })
                         : Array.Empty <XElement>());
 }