Kom ihåg mig?
Home Menu

Menu


hjälp med tänket kring sortering

Ämnesverktyg Visningsalternativ
Oläst 2018-05-10, 13:24 #1
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
Standard hjälp med tänket kring sortering

Hej,

behöver lite hjälp hur jag ska lösa dessa på smidigaste sättet.
jobbar i .NET C# och håller på att utveckla en "meny", där användarna själv kan lägga till egna menyner samt sorta dem i den ordning som de själva vill ha på dessa....

hur ska jag åstadkomma detta?

ex. en användare har lagt till tre menyer; om oss, hjälp, faq

denna användare har alltså 3 menyer, och vill nu lägga till en 4:e "hitta oss".

då vill jag att han får upp någonslags dropdown där han kan välja "Lägg till denna efter 'hjälp'".
naak2803 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2018-05-12, 05:13 #2
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Ok, slängde ihop ett förslag som du kan använda för att joxa fram och tillbaka med en meny. Det är gjort för att vara lite pedagogiskt så jag har INTE gjort några som helst försök att optimera, utan helt fokuserat på att bygga något som funkar och som är hyfsat lätt att förstå om man kan lite om C# och objektorientering.

Först skapade jag en klass för innehållet i varje menyval:
Citat:
// File: MenyVal.cs

namespace MenuSort
{
public class MenyVal
{
public int SortOrder { get; set; }
public string MenyText { get; set; }

public MenyVal()
{
}

public MenyVal(int SortOrder, string MenyText)
{
this.SortOrder = SortOrder;
this.MenyText = MenyText;
}

public override string ToString()
{
return $"{SortOrder} - {MenyText}";
}
}
}

Sen en klass för att hantera menyn som helhet, det gör genom att skapa en lista av MenyVal:

Citat:
// File: Meny.cs

using System;
using System.Collections.Generic;
using System.Linq;

namespace MenuSort
{
public class Meny : List<MenyVal>
{
public Meny()
{
}

public void SortBySortOrder()
{
this.Sort(new SortOrderComparer());
}

public MenyVal Add(string menyText)
{
int lastSortOrderNumber = RenumberSortOrderNumbers();
int nextSortOrderNumber = lastSortOrderNumber + 50;
Add(new MenyVal(SortOrder: nextSortOrderNumber, MenyText:menyText));
MenyVal lastAddedMenyVal = this.SingleOrDefault(m => m.SortOrder == nextSortOrderNumber);
RenumberSortOrderNumbers();
return lastAddedMenyVal;
}

public MenyVal MoveFirst(MenyVal menyVal)
{
RenumberSortOrderNumbers();
menyVal.SortOrder = 50;
RenumberSortOrderNumbers();
return menyVal;
}

public MenyVal MoveLast(MenyVal menyVal)
{
int lastSortOrderNumber = RenumberSortOrderNumbers();
menyVal.SortOrder = lastSortOrderNumber+50;
RenumberSortOrderNumbers();
return menyVal;
}

public MenyVal MoveUp(MenyVal menyVal)
{
RenumberSortOrderNumbers();
menyVal.SortOrder -= 150;
RenumberSortOrderNumbers();
return menyVal;
}

public MenyVal MoveDown(MenyVal menyVal)
{
RenumberSortOrderNumbers();
menyVal.SortOrder += 150;
RenumberSortOrderNumbers();
return menyVal;
}

public int RenumberSortOrderNumbers()
{
int start = 100;
int step = 100;
return RenumberSortOrderNumbers(start, step);
}

public int RenumberSortOrderNumbers(int start, int step)
{
int number = start;
int nextNumber = number-step;
SortBySortOrder();
foreach (MenyVal menyVal in this)
{
nextNumber += step;
menyVal.SortOrder = nextNumber;
}
return nextNumber;
}

public Meny SortBySortOrderUsingLINQ()
{
Meny nyMeny = new Meny();
nyMeny.AddRange(this.OrderBy(m => m.SortOrder).ToList<MenyVal>());
return nyMeny;
}

public void SortByMenyTextLength()
{
this.Sort(new MenyTextLengthComparer());
}

public void SortByMenyText()
{
this.Sort(new MenyTextComparer());
}

public void Display()
{
Console.WriteLine();
foreach (MenyVal meny in this)
{
Console.WriteLine($"{meny}");
}
}

public override string ToString()
{
string str = "";
foreach (MenyVal meny in this)
{
if (str.Length > 0) str += ", ";
str += $"{meny}";
}
return str;
}
}
}
Sen behöver man en klass som implementerar interfacet IComparer, man kan lösa detta genom att använda LINQ, som jag även gjort ett exempel på i meny.cs, men nu har jag försökt vara lite pedagogisk och då blir det inte alltid den lösning med minst kod. Men för att "walk the extra mile" och visa på hur man kan göra mer komplexa problem, så....

Citat:
// File: SortOrderComparer.cs

using System.Collections.Generic;

namespace MenuSort
{
public class SortOrderComparer : IComparer<MenyVal>
{
public int Compare(MenyVal x, MenyVal y)
{
int retVal = 0;
if (
((x == null) && (y != null))
||
(x.SortOrder < y.SortOrder)
)
{
retVal = -1;
}
else if (
((x != null) && (y == null))
||
(x.SortOrder > y.SortOrder)
)
{
retVal = 1;
}
return retVal;
}
}
}
I de exempel jag studerat på internet så förekommer det även andra sorteringsmekanismer som två sätt hur man sorterar på menytexten för att ta ett par exempel.

Citat:
// File: MenyTextLengthComparer.cs

using System.Collections.Generic;

namespace MenuSort
{
public class MenyTextLengthComparer : IComparer<MenyVal>
{
public int Compare(MenyVal x, MenyVal y)
{
int retVal = 0;
if ( ((x == null) && (y != null)) || (x.MenyText.Length > y.MenyText.Length) )
{
retVal = 1;
}
else if ( ((x != null) && (y == null)) || (x.MenyText.Length < y.MenyText.Length) )
{
retVal = -1;
}
else
{
retVal = x.MenyText.CompareTo(y.MenyText);
}
return retVal;
}
}
}


Citat:
// File: MenyTextComparer.cs

using System.Collections.Generic;

namespace MenuSort
{
public class MenyTextComparer : IComparer<MenyVal>
{

public int Compare(MenyVal x, MenyVal y)
{
int retVal = 0;
if ((x == null) && (y != null))
{
retVal = 1;
}
else if ((x != null) && (y == null))
{
retVal = -1;
}
else
{
retVal = x.MenyText.CompareTo(y.MenyText);
}
return retVal;
}
}
}

Senast redigerad av Conny Westh den 2018-05-12 klockan 05:16
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2018-05-12, 05:14 #3
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Slutligen så har vi ett litet enkelt testprogram som visar hur klasserna och metoderna kan användas i ett Console-program.

Citat:
// File: Program.cs
using System;

namespace MenuSort
{


class Program
{
static void Main(string[] args)
{

Meny mainMenu = new Meny();

mainMenu.Add(new MenyVal(SortOrder: 400, MenyText: "Verktyg"));
mainMenu.Add(new MenyVal(SortOrder: 100, MenyText: "Arkiv"));
mainMenu.Add(new MenyVal(SortOrder: 300, MenyText: "Inställningar"));
mainMenu.Add(new MenyVal(SortOrder: 200, MenyText: "Redigera"));
mainMenu.Add(new MenyVal(SortOrder: 500, MenyText: "Hjälp"));

Console.WriteLine("");
Console.WriteLine("Osorterad meny:");
Console.WriteLine($"{mainMenu}");
mainMenu.Display();

Console.WriteLine("");
Console.WriteLine("Samma meny sorterad efter SortOrder:");
mainMenu.SortBySortOrder();
Console.WriteLine($"{mainMenu}");
mainMenu.Display();

Console.WriteLine("");
Console.WriteLine("Samma meny sorterad efter Längd på MenyText:");
mainMenu.SortByMenyTextLength();
Console.WriteLine($"{mainMenu}");
mainMenu.Display();

Console.WriteLine("");
Console.WriteLine("Samma meny sorterad efter MenyText:");
mainMenu.SortByMenyText();
Console.WriteLine($"{mainMenu}");
mainMenu.Display();

Console.WriteLine("");
Console.WriteLine("Samma meny sorterad efter SortOrder med LINQ:");
mainMenu = mainMenu.SortBySortOrderUsingLINQ();
Console.WriteLine($"{mainMenu}");
mainMenu.Display();

// Kunden lägger till ett nytt menyval "Hitta oss..."
MenyVal nyMeny = mainMenu.Add(menyText: "Hitta oss...");

// Menyvalet hamnar sist i menyn
Console.WriteLine("");
Console.WriteLine("Kunden lägger till ett nytt menyval 'Hitta oss...', sist i menyn:");
mainMenu.SortBySortOrder();
Console.WriteLine($"{mainMenu}");
mainMenu.Display();

// Kunden kan nu flytta menyvalet, 2 steg upp i menyn
Console.WriteLine("");
Console.WriteLine("Kunden flyttar menyvalet 'Hitta oss...', 2 steg upp:");
mainMenu.MoveUp(nyMeny);
mainMenu.MoveUp(nyMeny);
mainMenu.SortBySortOrder();
Console.WriteLine($"{mainMenu}");
mainMenu.Display();

// Kunden kan nu flytta menyvalet, ett steg ner i menyn
Console.WriteLine("");
Console.WriteLine("Kunden flyttar menyvalet 'Hitta oss...', 1 steg ner:");
mainMenu.MoveDown(nyMeny);
mainMenu.SortBySortOrder();
Console.WriteLine($"{mainMenu}");
mainMenu.Display();


// Kunden kan nu flytta menyvalet, först i menyn
Console.WriteLine("");
Console.WriteLine("Kunden flyttar menyvalet 'Hitta oss...', Först i menyn:");
mainMenu.MoveFirst(nyMeny);
mainMenu.SortBySortOrder();
Console.WriteLine($"{mainMenu}");
mainMenu.Display();

// Kunden kan nu flytta menyvalet Sist i menyn
Console.WriteLine("");
Console.WriteLine("Kunden flyttar menyvalet 'Hitta oss...', Sist i menyn:");
mainMenu.MoveLast(nyMeny);
mainMenu.SortBySortOrder();
Console.WriteLine($"{mainMenu}");
mainMenu.Display();

}
}
}

Senast redigerad av Conny Westh den 2018-05-12 klockan 05:17
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 16:59.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017