如何确定顺序?
How to fix order by?
我在 asp.net mvc3 控制器中获得了这段代码,用于在下拉列表中查看和排序。但我的问题是,正如您在下图中看到的那样,它按 text and next to it the number
排序。如何解决这个问题?
ViewBag.AddrBarangay = new SelectList(db.Barangays, "BarangayId", "BarangayName", "").OrderBy(m => m.Text);
对于你的情况,你必须创建新的比较器,它可以在 lexicograhical order 中排序
您应该有自己的比较器实现,它实现了 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,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'));
我在 asp.net mvc3 控制器中获得了这段代码,用于在下拉列表中查看和排序。但我的问题是,正如您在下图中看到的那样,它按 text and next to it the number
排序。如何解决这个问题?
ViewBag.AddrBarangay = new SelectList(db.Barangays, "BarangayId", "BarangayName", "").OrderBy(m => m.Text);
对于你的情况,你必须创建新的比较器,它可以在 lexicograhical order 中排序
您应该有自己的比较器实现,它实现了 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,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'));