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被支持。
你的问题在别的地方,下面的工作:
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));