public virtual void Save(Lexicon lexicon) { Trace.WriteIf(Tracing.Is.TraceVerbose, string.Empty); if (null == lexicon) { throw new ArgumentNullException("lexicon"); } using (var writers = new StreamWriterDictionary("CANONICAL,SYNONYMS") { Access = FileAccess.Write, Mode = FileMode.Create, Share = FileShare.None }) { #if NET20 if (0 == IEnumerableExtensionMethods.Count(lexicon)) #else if (!lexicon.Any()) #endif { writers.Item(Location.FullName).WriteLine(string.Empty); return; } #if NET20 var items = new SortedList <string, LexicalItem>(); foreach (var item in lexicon) { items.Add(item.CanonicalForm, item); } foreach (var item in items) { var synonyms = new SortedList <string, string>(); foreach (var synonym in item.Value.Synonyms) { synonyms.Add(synonym, synonym); } writers .Item(Location.FullName) .WriteLine(StringExtensionMethods.FormatWith( "{0},{1}", CsvStringExtensionMethods.FormatCommaSeparatedValue(item.Value.CanonicalForm), CsvStringExtensionMethods.FormatCommaSeparatedValue(IEnumerableExtensionMethods.Concat(synonyms.Values, ';')))); } #else foreach (var item in lexicon.OrderBy(x => x.CanonicalForm)) { writers .Item(Location.FullName) .WriteLine("{0},{1}".FormatWith( item.CanonicalForm.FormatCommaSeparatedValue(), item.Synonyms.OrderBy(x => x).Concat(';').FormatCommaSeparatedValue())); } #endif } }