public static IEnumerable <LanguageModel <T> > Load <T>(XElement xProfile, out int maximumSizeOfDistribution, out int maxNGramLength)
        {
            if (xProfile.Name != LanguageIdentificationProfileElement)
            {
                throw new ArgumentException("Xml root is not " + LanguageIdentificationProfileElement, "xProfile");
            }

            var xParameters = xProfile.Element(ParametersElement);

            maximumSizeOfDistribution = int.Parse(xParameters.Element(MaximumSizeOfDistributionElement).Value);
            maxNGramLength            = int.Parse(xParameters.Element(MaxNGramLengthElement).Value);
            var xLanguageModels   = xProfile.Element(LanguageModelsElement);
            var persister         = new XmlLanguageModelPersister <T>();
            var languageModelList =
                xLanguageModels.Elements(XmlLanguageModelPersister <T> .RootElement).Select(persister.Load).ToList();

            return(languageModelList);
        }
        public static void Save <T>(IEnumerable <LanguageModel <T> > languageModels, int maximumSizeOfDistribution, int maxNGramLength, Stream outputStream)
        {
            var languageModelsCache = languageModels.ToArray();
            var languageMarks       =
                new Dictionary <string, Func <LanguageInfo, string> >
            {
                { "ISO 639-3", lm => lm.Iso639_3 },
                { "ISO 639-2-T", lm => lm.Iso639_2T },
                { "English name", lm => lm.EnglishName },
                { "local name", lm => lm.LocalName },
                { "any name available", lm => lm.Iso639_3 ?? lm.Iso639_2T ?? lm.EnglishName ?? lm.LocalName },
            };
            var f =
                languageMarks.ToDictionary(_ => _.Key, _ => languageModelsCache.Select(lm => _.Value(lm.Language)).ToList())
                .FirstOrDefault(_ => _.Value.All(name => name != null));
            var xComment =
                f.Key == null
                    ? new XComment("WARNING! Some of the language model(s) do(es)n't have any language name assigned")
                    : new XComment("Contains models for the following languages (by " + f.Key + "): " + String.Join(", ", f.Value));

            if (languageModelsCache.Any(lm => lm.Language.Iso639_3 != null))
            {
                ;
            }
            var persister = new XmlLanguageModelPersister <T>();
            var xDoc      =
                new XDocument(
                    xComment,
                    new XElement(LanguageIdentificationProfileElement,
                                 new XElement(ParametersElement,
                                              new XElement(MaximumSizeOfDistributionElement, maximumSizeOfDistribution),
                                              new XElement(MaxNGramLengthElement, maxNGramLength)),
                                 new XElement(LanguageModelsElement,
                                              languageModelsCache.Select(persister.ToXml)

                                              )));

            var xmlWriter = XmlWriter.Create(outputStream, new XmlWriterSettings {
                Indent = true
            });

            xDoc.WriteTo(xmlWriter);
            xmlWriter.Flush();
        }