public ActionResult Index() { List <Book> books = new List <Book>(db.Books); string sorting = Request.Cookies["sorting"]?.Value ?? String.Empty; if (sorting.Equals("byName")) { TitleComparer titleComparer = new TitleComparer(); books.Sort(titleComparer); } else if (sorting.Equals("byYear")) { YearComparer yearComparer = new YearComparer(); books.Sort(yearComparer); } ViewBag.Books = books; return(View()); }
public int Compare(Citation x, Citation y) { /* * This is an example of a custom sort macro that sorts all references of type 'internet document' on top of the bibliography. * The internet documents themselves are sorted according to a different logic than the rest of the cited documents. * Return values: * 0: x is considered the same as y sorting-wise, so we cannot tell a difference based on the algorithm below * > 0 (positive): x should go after y, x is greater than y * < 0 (negative): x should go before y, x is less than */ if (x == null || y == null) { return(0); } Reference xReference = x.Reference; Reference yReference = y.Reference; if (xReference == null || yReference == null) { return(0); } ReferenceType xReferenceType = xReference.ReferenceType; ReferenceType yReferenceType = yReference.ReferenceType; BibliographyCitation xBibliographyCitation = x as BibliographyCitation; BibliographyCitation yBibliographyCitation = y as BibliographyCitation; if (xBibliographyCitation == null || yBibliographyCitation == null) { return(0); } Template xTemplate = x.GetTemplateForCitation(); Template yTemplate = y.GetTemplateForCitation(); if (xTemplate == null || yTemplate == null) { return(0); } PersonFieldElement xPersonFieldElement = xTemplate.StructuralPersonFieldElement; PersonFieldElement yPersonFieldElement = yTemplate.StructuralPersonFieldElement; IEnumerable <Person> xPersons = xPersonFieldElement != null?xPersonFieldElement.GetPersonsCited(x) : Enumerable.Empty <Person>(); IEnumerable <Person> yPersons = yPersonFieldElement != null?yPersonFieldElement.GetPersonsCited(y) : Enumerable.Empty <Person>(); int xPersonsCount = 0; int yPersonsCount = 0; if (xPersons != null) { xPersonsCount = xPersons.Count(); } if (yPersons != null) { yPersonsCount = yPersons.Count(); } string xTitleForSorting = GetTitleForSorting(xReference); string yTitleForSorting = GetTitleForSorting(yReference); string xVolume = xReference.Volume; string yVolume = yReference.Volume; string xSeriesTitleForSorting = GetSeriesTitleForSorting(xReference); string ySeriesTitleForSorting = GetSeriesTitleForSorting(yReference); string xNumber = xReference.Number; string yNumber = yReference.Number; StringComparer defaultStringComparer = StringComparer.Create(_cultureForSorting, true); int personsCompareResult = 0; int personsCountCompareResult = 0; int titleCompareResult = 0; int seriesTitleCompareResult = 0; int volumeCompareResult = 0; int numberCompareResult = 0; int yearCompareResult = 0; int editionCompareResult = 0; if (xPersonsCount == 0 && yPersonsCount == 0) { //compare Titles titleCompareResult = xTitleForSorting.CompareTo(yTitleForSorting); if (titleCompareResult != 0) { return(titleCompareResult); } seriesTitleCompareResult = xSeriesTitleForSorting.CompareTo(ySeriesTitleForSorting); if (seriesTitleCompareResult != 0) { return(seriesTitleCompareResult); } } else if (xPersonsCount == 0 && yPersonsCount > 0) { //compare xTitle with yFirstAuthor titleCompareResult = defaultStringComparer.Compare(xTitleForSorting, yPersons.ElementAt(0).FullName); if (titleCompareResult != 0) { return(titleCompareResult); } } else if (xPersonsCount > 0 && yPersonsCount == 0) { //compare xFirstAuthor with yTitle titleCompareResult = defaultStringComparer.Compare(xPersons.ElementAt(0).FullName, yTitleForSorting); if (titleCompareResult != 0) { return(titleCompareResult); } } else { /* * 1. Single Author Group * 2. Author + Single Co-Author Group * 3. Author + Multiple-Co-Authors Group */ //compare by first author personsCompareResult = ComparePersons(xPersons.ElementAt(0), yPersons.ElementAt(0)); if (personsCompareResult != 0) { return(personsCompareResult); } //still here? then both have same first author if ((xPersonsCount == 1 && yPersonsCount > 1) || (xPersonsCount == 2 && yPersonsCount > 2)) { //x before y return(-1); } if ((xPersonsCount > 1 && yPersonsCount == 1) || (xPersonsCount > 2 && yPersonsCount == 2)) { //x after y return(1); } if (xPersonsCount == 2 && yPersonsCount == 2) { //compare by co-author personsCompareResult = ComparePersons(xPersons.ElementAt(1), yPersons.ElementAt(1)); if (personsCompareResult != 0) { return(personsCompareResult); } } //still here? //both have either exactly one identical author OR //both have exactly two identical authors OR //more than 2 authors with identical first author //we continue with year comparison } #region Year yearCompareResult = YearComparer.Compare(x, y); if (yearCompareResult != 0) { return(yearCompareResult); } #endregion Year #region Title titleCompareResult = defaultStringComparer.Compare(xTitleForSorting, yTitleForSorting); if (titleCompareResult != 0) { return(titleCompareResult); } #endregion Title #region Volume if ( xReferenceType == yReferenceType && xReference.HasCoreField(ReferenceTypeCoreFieldId.Volume) && yReference.HasCoreField(ReferenceTypeCoreFieldId.Volume) && HasFieldElement(xTemplate, ReferencePropertyId.Volume) && HasFieldElement(yTemplate, ReferencePropertyId.Volume) ) { NumberStringComparer volumeComparer = new NumberStringComparer() { CompareMode = NumberStringCompareMode.ByTextAndNumbersSegmentwise, UseAbsoluteNumbersOnly = true }; volumeCompareResult = volumeComparer.Compare(xVolume, yVolume); if (volumeCompareResult != 0) { return(volumeCompareResult); } } #endregion Volume #region Number if ( xReferenceType == yReferenceType && xReference.HasCoreField(ReferenceTypeCoreFieldId.Number) && yReference.HasCoreField(ReferenceTypeCoreFieldId.Number) && HasFieldElement(xTemplate, ReferencePropertyId.Number) && HasFieldElement(yTemplate, ReferencePropertyId.Number) ) { NumberStringComparer numberComparer = new NumberStringComparer() { CompareMode = NumberStringCompareMode.ByTextAndNumbersSegmentwise, UseAbsoluteNumbersOnly = true }; numberCompareResult = numberComparer.Compare(xNumber, yNumber); if (numberCompareResult != 0) { return(numberCompareResult); } } #endregion #region Edition if ( xReference.HasCoreField(ReferenceTypeCoreFieldId.Edition) && yReference.HasCoreField(ReferenceTypeCoreFieldId.Edition) && HasFieldElement(xTemplate, ReferencePropertyId.Edition) && HasFieldElement(yTemplate, ReferencePropertyId.Edition) ) { var xEdition = xReference.EditionNumberResolved; var yEdition = yReference.EditionNumberResolved; bool xHasEdition = !string.IsNullOrEmpty(xEdition); bool yHasEdition = !string.IsNullOrEmpty(yEdition); if (xHasEdition && yHasEdition) { NumberStringComparer editionComparer = new NumberStringComparer() { CompareMode = NumberStringCompareMode.ByTextAndNumbersSegmentwise, UseAbsoluteNumbersOnly = true }; editionCompareResult = editionComparer.Compare(xEdition, yEdition); if (editionCompareResult != 0) { return(editionCompareResult); } } else if (xHasEdition && !yHasEdition) //y before x { return(1); } else if (!xHasEdition && yHasEdition) //x before y { return(-1); } } #endregion return(0); }
public int Compare(Citation x, Citation y) { /* * This is an example of a custom sort macro that sorts all references of type 'internet document' on top of the bibliography. * The internet documents themselves are sorted according to a different logic than the rest of the cited documents. * Return values: * 0: x is considered the same as y sorting-wise, so we cannot tell a difference based on the algorithm below * > 0 (positive): x should go after y, x is greater than y * < 0 (negative): x should go before y, x is less than */ if (x == null || y == null) { return(0); } Reference xReference = x.Reference; Reference yReference = y.Reference; if (xReference == null || yReference == null) { return(0); } ReferenceType xReferenceType = xReference.ReferenceType; ReferenceType yReferenceType = yReference.ReferenceType; var xAuthors = xReference.AuthorsOrEditorsOrOrganizations; var yAuthors = yReference.AuthorsOrEditorsOrOrganizations; int xAuthorsCount = 0; int yAuthorsCount = 0; if (xAuthors != null) { xAuthorsCount = xAuthors.Count; } if (yAuthors != null) { yAuthorsCount = yAuthors.Count; } string xTitleForSorting = GetTitleForSorting(xReference); string yTitleForSorting = GetTitleForSorting(yReference); string xVolume = xReference.Volume; string yVolume = yReference.Volume; string xSeriesTitleForSorting = GetSeriesTitleForSorting(xReference); string ySeriesTitleForSorting = GetSeriesTitleForSorting(yReference); StringComparer defaultStringComparer = StringComparer.Create(_cultureForSorting, true); int authorCompareResult = 0; int authorsCountCompareResult = 0; int titleCompareResult = 0; int seriesTitleCompareResult = 0; int volumeCompareResult = 0; int yearCompareResult = 0; int editionCompareResult = 0; /* * Die Werke werden in alphabetischer Reihenfolge nach den Familiennamen der Erstautoren bzw. -autorinnen gereiht. * Ist bei einer Quelle kein Autor bzw. keine Autorin vorhanden, rückt der Titel an die Stelle des Autorennamens und das Werk * wird nach dem ersten Wort des Titels (wobei bestimmte und unbestimmte Artikel unberücksichtigt bleiben) alphabetisch gereiht. */ if (xAuthorsCount == 0 && yAuthorsCount == 0) { //compare Titles titleCompareResult = xTitleForSorting.CompareTo(yTitleForSorting); if (titleCompareResult != 0) { return(titleCompareResult); } seriesTitleCompareResult = xSeriesTitleForSorting.CompareTo(ySeriesTitleForSorting); if (seriesTitleCompareResult != 0) { return(seriesTitleCompareResult); } } else if (xAuthorsCount == 0 && yAuthorsCount > 0) { //compare xTitle with yFirstAuthor titleCompareResult = defaultStringComparer.Compare(xTitleForSorting, yAuthors.ElementAt(0).FullName); if (titleCompareResult != 0) { return(titleCompareResult); } } else if (xAuthorsCount > 0 && yAuthorsCount == 0) { //compare xFirstAuthor with yTitle titleCompareResult = defaultStringComparer.Compare(xAuthors.ElementAt(0).FullName, yTitleForSorting); if (titleCompareResult != 0) { return(titleCompareResult); } } else { int minAuthorCount = Math.Min(xAuthorsCount, yAuthorsCount); for (int i = 0; i < minAuthorCount; i++) { authorCompareResult = CompareAuthors(xAuthors.ElementAt(i), yAuthors.ElementAt(i)); if (authorCompareResult != 0) { return(authorCompareResult); } authorsCountCompareResult = xAuthorsCount.CompareTo(yAuthorsCount); if (authorsCountCompareResult != 0) { return(authorsCountCompareResult); } } } /* * Innerhalb der Gruppe chronologisch aufsteigend */ #region Year yearCompareResult = YearComparer.Compare(x, y); if (yearCompareResult != 0) { return(yearCompareResult); } #endregion Year #region Volume if ( xReferenceType == yReferenceType && xReference.HasCoreField(ReferenceTypeCoreFieldId.Volume) && yReference.HasCoreField(ReferenceTypeCoreFieldId.Volume) ) { NumberStringComparer volumeComparer = new NumberStringComparer() { CompareMode = NumberStringCompareMode.ByTextAndNumbersSegmentwise, UseAbsoluteNumbersOnly = true }; volumeCompareResult = volumeComparer.Compare(xVolume, yVolume); if (volumeCompareResult != 0) { return(volumeCompareResult); } } #endregion Volume #region Title titleCompareResult = defaultStringComparer.Compare(xTitleForSorting, yTitleForSorting); if (titleCompareResult != 0) { return(titleCompareResult); } #endregion Title #region Edition if ( xReference.HasCoreField(ReferenceTypeCoreFieldId.Edition) && yReference.HasCoreField(ReferenceTypeCoreFieldId.Edition) ) { var xEdition = xReference.EditionNumberResolved; var yEdition = yReference.EditionNumberResolved; bool xHasEdition = !string.IsNullOrEmpty(xEdition); bool yHasEdition = !string.IsNullOrEmpty(yEdition); if (xHasEdition && yHasEdition) { NumberStringComparer editionComparer = new NumberStringComparer() { CompareMode = NumberStringCompareMode.ByTextAndNumbersSegmentwise, UseAbsoluteNumbersOnly = true }; editionCompareResult = editionComparer.Compare(xEdition, yEdition); if (editionCompareResult != 0) { return(editionCompareResult); } } else if (xHasEdition && !yHasEdition) //y before x { return(1); } else if (!xHasEdition && yHasEdition) //x before y { return(-1); } } #endregion return(0); }