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

本文关键字:数据 不正确 成员 应用于 OrderBy 模型 属性 int | 更新日期: 2023-09-27 18:12:31

我试图在我的一个视图中实现一个排序机制,但是看起来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)

控制器返回视图:

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

控制器:

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

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

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

我很习惯实现模糊的变通方法来使东西工作,但看起来这里有一些我不知道的东西:似乎OrderBy只正确处理小数字?

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

我将问题中的代码简化为以下代码-它工作得非常好;. 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));