Orderby()没有正确排序数字c#

Dar*_*rcy 37 c# linq asp.net-mvc sql-order-by linq-to-sql

我正在为我的公司编写一个应用程序,目前正致力于搜索功能.当用户搜索项目时,我想显示最高版本(存储在数据库中).

问题是,版本存储为字符串而不是int,当我对结果执行OrderBy(q => q.Version)时,它们会像

1
10
11
2
3
...
Run Code Online (Sandbox Code Playgroud)

显然2在10之前.

有没有办法让我把版本转换为整数或者那里有一个简单的IComparer?到目前为止,我找不到任何实质内容.

我试过这样做:

var items = (from r in results
             select r).OrderBy(q => Int32.Parse(q.Version));
Run Code Online (Sandbox Code Playgroud)

这编译但不起作用.

Yur*_*ich 7

您的问题在其他地方,以下工作:

new[] { "1", "10", "2", "3", "11" }
    .OrderBy(i => int.Parse(i))
    .ToList()
    .ForEach(Console.WriteLine);
Run Code Online (Sandbox Code Playgroud)

如果你的问题是LINQ to SQL,那么正在发生的事情是CLR试图从你的LINQ创建SQL并且不理解int.Parse.您可以做的是首先从SQL获取数据,然后在加载所有数据后对其进行排序:

var items = (from r in results
             select r)
            .ToList()
            .OrderBy(q => Int32.Parse(q.Version));
Run Code Online (Sandbox Code Playgroud)

应该这样做.


Dam*_*ver 6

如果您无法更改表定义(因此版本是数字类型),并且您的查询确实如下所示(您不使用跳过,或采取或以其他方式减少结果数),您可以做的最好在未排序的结果上调用"ToList",然后当你将一个OrderBY lambda应用到它时,它将发生在你的代码中,而不是试图在SQL Server端执行(现在应该可以工作).

  • 请注意,您还可以使用`AsEnumerable`而不是`ToList`将查询提供程序更改回linq-to-objects,但保留linq查询的延迟执行语义,而不是强制执行. (4认同)

Tho*_*mas 5

你为什么要在lambda中排序?你为什么不在查询中排序?

var query = from r in items
            orderby int.Parse( r )
            select r;
Run Code Online (Sandbox Code Playgroud)

现在我们知道您正在使用LINQ to SQL,您可以考虑通过执行以下操作来对此进行标准SQL调用:

Select ..., Cast( TextWhichShouldBeIntCol As int ) As IntCol
From ...
Run Code Online (Sandbox Code Playgroud)

甚至

Select ..., Cast( TextWhichShouldBeIntCol As int ) As IntCol
From ...
Order By Cast( TextWhichShouldBeIntCol As int )
Run Code Online (Sandbox Code Playgroud)

这将作为一个int渗入你的LINQ(如果你使用第二次迭代,请订购).这避免了必须在LINQ中执行两次结果集(一次用于查询,一次用于排序).

  • 不,它在性能上有所不同 - 数据库具有良好的排序过程,有些可以并行处理构建结果​​集,因此数据库中的排序通常会更快,而且很少变慢. (2认同)
  • 不仅如此,您在列表中循环两次:一次用于查询,一次用于lambda. (2认同)

Len*_*rri 5

有一个很棒的代码,在自然分类方面做得很好.它的名字是AlphanumComparator.

示例代码:

var ordered = Database.Cars.ToList().OrderBy(c => c.ModelString, new AlphanumComparator());
Run Code Online (Sandbox Code Playgroud)

请注意,列表必须在内存中.

如果您获得了C#版本,请执行以下操作:

AlphanumComparator : IComparer<string>
Run Code Online (Sandbox Code Playgroud)

public int Compare(string x, string y)
Run Code Online (Sandbox Code Playgroud)