按引用C#排序列表

时间:2012-02-20 09:18:06

标签: c# list sorting

我有一个List<Unit> Unit包含NameValue。在此对象中,我存储有关服装尺寸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)

我无法对字符串ASCEDESC进行排序,因为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();

我可以改进哪些评论或事情?

5 个答案:

答案 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);

比较委托基本上将两个变量xy作为输入并返回:

<0 (if x < y)
>0 (if x > y)
0  (if x == y)

查看此页面以获取更多信息:http://msdn.microsoft.com/en-us/library/w56d4y5z.aspx