Ale*_*lex 1 c# linq asp.net-mvc-4
我试图在我的一个视图中实现一个排序机制,但它看起来像OrderBy无法处理"大"(更多下面)整数字段,最终以混乱的顺序结束.
以下是所涉及的所有代码,尽可能地删除:
楷模:
public class MyModel
{
public MyOption Option { get; set; }
}
public class MyOption
{
public int Value {get; set;}
public string Descr{get; set;}
}
Run Code Online (Sandbox Code Playgroud)
DisplayTemplates\MyOption
@model MyOption
@Html.Label(Model.Description)
Run Code Online (Sandbox Code Playgroud)
控制器的返回视图:
@model List<MyModel>
<ul>
@foreach(var row in Model)
{
<li>@Html.DisplayFor(x => row.Option)</li>
}
</ul>
Run Code Online (Sandbox Code Playgroud)
控制器:
private List<MyModel> FakeRetrieveFromRepo()
{
return new List<MyModel>
{
new MyModel { Option = new MyOption { Value = 121370002, Descr = "One" }},
new MyModel { Option = new MyOption { Value = 121370000, Descr = "Two" }},
new MyModel { Option = new MyOption { Value = 121370001, Descr = "Three" }},
};
// Debugging confirms this order is kept
}
public ActionResult Index()
{
List<MyModel> data = FakeRetrieveFromRepo();
// "Offending" line: sorting is supposed to be done here
// neither .Option nor .Option.Value can be null
data = data.OrderBy(row => row.Option.Value).ToList();
// I expect the list to be sorted in this fashion
// [ {Option={ Value = 121370000, Descr = "Two" }},
// {Option={ Value = 121370001, Descr = "Three" }},
// {Option={ Value = 121370002, Descr = "One" }} ]
return View(data);
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试这样排序,实际上不会进行排序,视图中的数据与存储库提供的顺序相同.如果我像这样改变那条线,神奇的是排序发生并给我预期的结果:
// If I change the line like this, sorting takes place!
data = data.OrderBy(row => row.Option.Value % 121370000).ToList();
Run Code Online (Sandbox Code Playgroud)
我已经习惯于实现模糊的解决方法来使东西工作,但它看起来像我在这里不知道的东西:似乎OrderBy只能正确处理小数字?
我把问题中的代码减少到了以下内容 - 它的工作原理非常好; .NET可以很好地处理大数字.因此,这给我们留下了最可能的答案,即问题不在示例中 - 简化代码很棒,但是您需要找到一个显示问题的最小可运行示例.大多数情况下,当试图获得最小的repro时,找到"我的示例代码和我的真实代码之间有什么不同"的行为将告诉你问题是什么.不幸的是,我们无法为您做到这一点,因为我们无法看到真正的代码.
以下工作正常:
static void Main()
{
var data = FakeRetrieveFromRepo();
// order here is "One", "Two", "Three"
data = data.OrderBy(row => row.Option.Value).ToList();
// order here is "Two", "Three", "One"
}
private static List<MyModel> FakeRetrieveFromRepo()
{
return new List<MyModel>
{
new MyModel { Option = new MyOption {
Value = 121370002, Description = "One" }},
new MyModel { Option = new MyOption {
Value = 121370000, Description = "Two" }},
new MyModel { Option = new MyOption {
Value = 121370001, Description = "Three" }},
};
}
Run Code Online (Sandbox Code Playgroud)
纯粹地说,假设您不需要单独保留原始列表(缓存等) - 就地排序更有效:
data.Sort((x, y) => x.Option.Value.CompareTo(y.Option.Value));
Run Code Online (Sandbox Code Playgroud)