我在asp.net mvc3控制器中获取此代码,以便在下拉列表中查看和订购。但我的问题是你可以在下面的图片中看到text and next to it the number
的顺序。如何解决这个问题?。
ViewBag.AddrBarangay = new SelectList(db.Barangays, "BarangayId", "BarangayName", "").OrderBy(m => m.Text);
答案 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'));