如何修理订单?

时间:2017-02-06 05:33:55

标签: c# asp.net asp.net-mvc-3

我在asp.net mvc3控制器中获取此代码,以便在下拉列表中查看和订购。但我的问题是你可以在下面的图片中看到text and next to it the number的顺序。如何解决这个问题?。

ViewBag.AddrBarangay = new SelectList(db.Barangays, "BarangayId", "BarangayName", "").OrderBy(m => m.Text);

enter image description here

2 个答案:

答案 0 :(得分:3)

对于您的情况,您必须创建可以在lexicograhical order中排序的新Comparer 您应该拥有自己的比较器实现,它实现IComparer<string>接口。你的比较器应该是这样的:

public class LexicoComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        var firstArgumentSplits = x.Split(' ');
        var secondArgumentSplits = y.Split(' ');

        if (firstArgumentSplits.Length == 2 && secondArgumentSplits.Length == 2)
        {
            int firstArgumentInt, secondArgumentInt;
            if (firstArgumentSplits[0] == secondArgumentSplits[0])
            {
                if (int.TryParse(firstArgumentSplits[1], out firstArgumentInt))
                {
                    if (int.TryParse(secondArgumentSplits[1], out secondArgumentInt))
                    {
                        return firstArgumentInt == secondArgumentInt ? 0 : firstArgumentInt > secondArgumentInt ? 1 : 0;
                    }

                }
            }
        }


        return String.Compare(x, y);
    }
}

现在您在OrderBy中使用上述比较器:

ViewBag.AddrBarangay = new SelectList(db.Barangays,
      "BarangayId", "BarangayName", "").OrderBy(m => m.Text,
                                      new LexicoComparer());

答案 1 :(得分:2)

虽然恕我直言,解决此问题的最佳方法是将1,10,100中的值存储在 SelectList 值属性中并输入它。如果由于某种原因你不能这样做,那么你需要在OrderBy子句中提供自定义 EqualityComparer

此外,如果您的文字Barangay始终保持不变,那么您也可以这样做(虽然这不是一个非常好的方法,因为它不通用): -

int maxSize = db.Barangays.Max(x => x.Text.Length);
ViewBag.AddrBarangay = new SelectList(db.Barangays, "BarangayId", "BarangayName", "")
                .OrderBy(m => m.Text.Replace("Barangay","").Trim().PadLeft(maxSize ,'0'));