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

时间:2010-03-09 15:17:22

标签: c# asp.net-mvc linq linq-to-sql sql-order-by

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

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

一样返回
1
10
11
2
3
...

显然2在10之前。

我有没有办法将版本转换为整数或是否有一个简单的IComparer?到目前为止,我找不到任何实质内容。

我试过这样做:

var items = (from r in results
             select r).OrderBy(q => Int32.Parse(q.Version));

这会编译但不起作用。

12 个答案:

答案 0 :(得分:25)

答案 1 :(得分:7)

您的问题出在其他地方,以下是有效的:

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

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

var items = (from r in results
             select r)
            .ToList()
            .OrderBy(q => Int32.Parse(q.Version));

应该这样做。

答案 2 :(得分:6)

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

答案 3 :(得分:5)

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

var query = from r in items
            orderby int.Parse( r )
            select r;

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

Select ..., Cast( TextWhichShouldBeIntCol As int ) As IntCol
From ...

甚至

Select ..., Cast( TextWhichShouldBeIntCol As int ) As IntCol
From ...
Order By Cast( TextWhichShouldBeIntCol As int )

这将作为一个int流入你的LINQ(如果你使用第二次迭代,则需要订购)。这避免了必须在LINQ中两次遍历结果集(一次用于查询,一次用于排序)。

答案 4 :(得分:5)

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

示例代码:

var ordered = Database.Cars.ToList().OrderBy(c => c.ModelString, new AlphanumComparator());

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

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

AlphanumComparator : IComparer<string>

public int Compare(string x, string y)

答案 5 :(得分:1)

我做了一个测试。我有以下代码。

string[] versions = { "1", "2", "10", "12", "22", "30" };
foreach (var ver in versions.OrderBy(v => v))
{
     Console.WriteLine(ver);
}

正如所料,结果是1分,10分,12分,2分,22分,30分 然后,我们将versions.OrderBy(v => v))更改为versions.OrderBy(v => int.Parse(v)))。它工作正常:1,2,10,12,22,30

我认为你的问题是你的字符串中有非数字字符,如'。'。你得到什么样的例外?

答案 6 :(得分:1)

试试这个:

var items = results.(Select(v => v).OrderBy(v => v.PadLeft(4));

这将在Linq2Sql中起作用

答案 7 :(得分:1)

如果您只需要“最高版本”,为什么要排序?如果您使用Max(),听起来可以避免一些开销。

另外,您确实应该将列类型更改为整数。

答案 8 :(得分:1)

var items = (from r in results
         select r).OrderBy(q => Convert.ToInt32(q.Version));

绝对跑......

答案 9 :(得分:0)

听起来你有一个文本值而不是数值。

如果您需要排序,可以尝试:

var items = (from r in results
             select r);
return items.OrderBy( v=> Int.Parse(v.Version) );

答案 10 :(得分:0)

var query = from r in items
            let n = int.Parse(r)
            orderby n
            select n;

答案 11 :(得分:0)

var items = (from v in results
                    select v).ToList().OrderBy(x => int.Parse(x.Version));