c# - 将 OrderBy 应用于模型属性的 int 成员时会出现不正确的数据?

标签 c# linq asp.net-mvc-4

我正在尝试在我的一个 View 中实现一种排序机制,但看起来 OrderBy 无法处理“大”(详见下文)整数字段,结果一团糟订单。

这里是所有涉及的代码,尽可能精简:

模型:

public class MyModel
{
    public MyOption Option { get; set; }
}
public class MyOption
{
    public int Value {get; set;}
    public string Descr{get; set;}
}

DisplayTemplates\MyOption

@model MyOption
@Html.Label(Model.Description)

Controller 的返回 View :

@model List<MyModel>
<ul>
@foreach(var row in Model)
{
    <li>@Html.DisplayFor(x => row.Option)</li>
}
</ul>

Controller :

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);
}

如果我尝试像这样排序,实际上没有排序, View 中的数据与存储库提供的顺序相同。如果我像这样更改该行,排序就会神奇地发生并给我预期的结果:

    // If I change the line like this, sorting takes place!
    data = data.OrderBy(row => row.Option.Value % 121370000).ToList();

我很习惯实现晦涩的变通办法来让事情正常进行,但看起来这里有些东西我不知道:OrderBy 似乎只能正确处理小数字?

最佳答案

我已将问题中的代码缩减为以下内容 - 它工作得非常好; .NET 可以很好地处理大量数据。所以这给我们留下了最有可能的答案,即问题不在示例中 - 简化代码很好,但您需要找到一个最小的可运行示例显示问题。大多数时候,当试图获得最小的重现时,发现“我的示例代码和我的真实代码之间有什么不同”这一行为将告诉您问题是什么。遗憾的是,我们无法为您做到这一点,因为我们看不到真正的代码。

以下工作正常:

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" }},
    };
}

顺便说一句,假设您不需要单独保留原始列表(缓存等)——就地排序更有效:

data.Sort((x, y) => x.Option.Value.CompareTo(y.Option.Value));

关于c# - 将 OrderBy 应用于模型属性的 int 成员时会出现不正确的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16418832/

相关文章:

c# - 如何从表中获取列的子集而不需要 Linq 中的新类型

c# - Mongodb C# 驱动程序 : view MQL bson query generated from linq

javascript - 如何将字节 []/内存流绑定(bind)到 Javascript 中的图像 src 属性

c# - 如何在 asp.net MVC 4 和 MVC 5 中设置默认 Controller

c# - 在 try-finally block 中等待

javascript - 基于选中的复选框启用和禁用两个不同的按钮 - JQuery

c# - 在 R* Tree 中插入新叶子

c# - 为什么要实现接口(interface)?

c# - Distinct() 是否保留始终取列表中的第一个元素

jquery - JSONP 与 ASP.NET Web API