我有一个List<Unit>
Unit
包含Name
和Value
。在此对象中,我存储有关服装尺寸Name
的信息,其中包含尺码名称(S,M,L,XL ..),Value
包含该尺寸的数量。
此单元列表包含在数据库中,但列表以随机顺序排列,因此在侦听器中可能如下所示:
Unit(M,3)
Unit(S,1)
Unit(XXL,2)
Unit(L,2)
我想对列表进行排序,使其更像是这样:
Unit(S,1)
Unit(M,3)
Unit(L,2)
Unit(XXLL,2)
我无法对字符串ASCE
或DESC
进行排序,因为M
位于S
之前,依此类推。
然后我想我可能会创建一个具有正确顺序的参考数组(XXS,XS,S,M,L,XL,XXL,XXXL),但是如何根据参考对我的列表进行排序。
还有其他聪明的方法吗?
更新
感谢所有好的答案,我登陆了Enum
解决方案,最终看起来像这样:
public class Unit
{
public Unit()
{
}
public Unit(string name, int value)
{
Value = value;
SizeCode = AssignSizeCode(name);
}
public SizeCode SizeCode { get; set; }
public int Value { get; set; }
private SizeCode AssignSizeCode(string name)
{
switch (name)
{
case "XXS":
return SizeCode.XXS;
case "XS":
return SizeCode.XS;
case "S":
return SizeCode.S;
case "M":
return SizeCode.M;
case "L":
return SizeCode.L;
case "XL":
return SizeCode.XL;
case "XXL":
return SizeCode.XXL;
case "XXXL":
return SizeCode.XXXL;
default:
return SizeCode.Unknown;
}
}
}
public enum SizeCode
{
XXS = 1,
XS = 2,
S = 3,
M = 4,
L = 5,
XL = 6,
XXL = 7,
XXXL = 8,
Unknown = 9
}
我这样排序:
units = units.OrderBy(x => (int)x.SizeCode).ToList();
我可以改进哪些评论或事情?
答案 0 :(得分:3)
如何使用枚举
public enum Size
{
Small = 1,
Medium = 2,
// etc
}
然后,您可以将Unit类中的枚举值转换为int,并按整数值排序。
答案 1 :(得分:2)
好的,我认为您的数据库中应该有OrderIndex列,并按该列排序。
脏的方法是拥有自己的接口类:IComparer或与委托进行排序相同。
在MSDN中检查ICompararer:http://msdn.microsoft.com/en-us/library/system.collections.icomparer.aspx
答案 2 :(得分:1)
您可以完全按照MSDN建议的那样here:
// First, declare a few classes that implement the IComparer interface.
public class CompareShirtSize : IComparer<string>
{
// Because the class implements IComparer, it must define a
// Compare method. The method returns a signed integer that indicates
// whether s1 > s2 (return is greater than 0), s1 < s2 (return is negative),
// or s1 equals s2 (return value is 0). This Compare method compares strings.
public int Compare(string size1, string size2)
{
// Do size comarison here
return ConvertSizeToInt(size1) - ConvertSizeToInt(size2);
}
private int ConvertSizeToInt(string size)
{
switch (size)
{
case "XXS":
return 1;
case "XS":
return 2;
case "S":
return 3;
case "M":
return 4;
case "L":
return 5;
default:
// some error handling
}
}
// The following method tests the Compare methods defined in the previous classes.
public static void OrderByIComparer()
{
List<Unit> units;
// Sort the elements of the array alphabetically.
var sortedList = units.OrderBy(unit => unit.Size, new CompareShirtSize ());
}
答案 3 :(得分:0)
您可以在班级Size
中添加int
类型的Unit
属性。然后使用此Size
属性对列表进行排序。
public class Unit1
{
public Unit1(string name)
{
this.Name = name;
switch (this.Name)
{
case "XXS":
this.Size = 1;
break;
case "XS":
this.Size = 2;
break;
case "S":
this.Size = 3;
break;
case "M":
this.Size = 4;
break;
case "L":
this.Size = 5;
break;
}
}
public string Name { get; set; }
public int Size { get; private set; }
public int Value { get; set; }
}
private static void Main(string[] args)
{
List<Unit1> list1 = new List<Unit1>();
list1.Add(new Unit1("XS") { Value = 1 });
list1.Add(new Unit1("M") { Value = 1 });
list1.Add(new Unit1("S") { Value = 1 });
list1.Add(new Unit1("L") { Value = 1 });
var sortedList = list1.OrderBy(z => z.Size).ToList();
}
答案 4 :(得分:0)
您只需使用比较代表。首先,创建一个只为每个大小分配一个数字的函数,然后将其用于比较:
(我不确定你的大小是否作为一个字符串存储为枚举;但我建议将它们存储为带有序号的枚举,按照大小的顺序,增加或减少。这将有助于使你的比较代表更快更简单)。
public class ShirtSizeCompare {
private static int getIndex(Unit x) {
if(x == Null) { return -1; }
if(x.size == "S") {
return 0;
} else if(x.size == "M") {
return 1;
}
///...
}
private static int CompareShirts(Unit x, Unit y) {
int _x = getIndex(x);
int _y = getIndex(y);
if(_x < _y) {
return -1;
} else if(_x == _y) {
return 0;
} else {
return 1;
}
}
}
然后,只需使用Comparison
委托对列表进行排序:
List<Unit> unitList;
unitList.sort(CompareShirts);
比较委托基本上将两个变量x
和y
作为输入并返回:
<0 (if x < y)
>0 (if x > y)
0 (if x == y)
查看此页面以获取更多信息:http://msdn.microsoft.com/en-us/library/w56d4y5z.aspx