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;
}
}
}
|