Orderby()不正确sorting数字c#

我正在为我的公司编写一个应用程序,目前正在进行searchfunction。 当用户search一个项目时,我想显示最高版本(存储在数据库中)。

问题是,版本被存储为一个string而不是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)); 

这编译但不起作用。

LinqToSql翻译器不支持Int32.Parse。 Convert.ToInt32被支持。

http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx

http://msdn.microsoft.com/en-us/library/bb882655.aspx

你的问题在别的地方,下面的工作:

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

如果你的问题是LINQ to SQL,那么发生什么事是CLR试图从你的LINQ中创buildSQL,而不理解int.Parse 。 你可以做的是首先从SQL获取数据,然后在所有数据加载完成后进行sorting:

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

应该这样做。

如果您无法更改表定义(因此版本是数字types),并且您的查询确实如列出(您不使用跳过,或采取或以其他方式减less结果数量),那么您可以做的最好的在未sorting的结果上调用“ToList”,当你将一个OrderBY lambda应用到你的代码中,而不是在SQL Server端(现在应该可以)工作的时候。

你为什么在lambdasorting? 你为什么不在查询中sorting呢?

 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 ) 

这将stream血到你的LINQ作为一个int(如果你使用第二次迭代,有序)。 这样可以避免在LINQ中经历两次结果集(一次用于查询,一次用于sorting)。

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

示例代码:

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

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

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

 AlphanumComparator : IComparer<string> 

 public int Compare(string x, string y) 

我做了一个testing。 我有以下代码。

 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 => v))versions.OrderBy(v => int.Parse(v))) 。 它工作得很好:1,2,10,12,22,30

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

尝试这个:

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

这将在Linq2Sql中工作

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

此外,你真的应该改变列的types为整数。

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

肯定会跑……

这听起来像你有一个文本值,而不是一个数字值。

如果你需要sorting,你可以尝试:

 var items = (from r in results select r); return items.OrderBy( v=> Int.Parse(v.Version) ); 
 var query = from r in items let n = int.Parse(r) orderby n select n; 
 var items = (from v in results select v).ToList().OrderBy(x => int.Parse(x.Version));