0

使用 VB.NET、Framework 4.0、EF5、VS2010

作为 Linq 的初学者,我尝试了很多东西,但无法使其正常工作。

Dim ctx As New Context

Dim query = (From a In ctx.TblAddress
             Where (a.ID = 103)
             Order By a.StreetAddress
             Select a.ID, a.StreetAddress).ToList()

然后我将此实体绑定到 RadGrid。

但我想将 StreetAddresses 排序为字母数字。

我可以管理它来处理这样的字符串数组:

Dim address As String() = {"Street Name C21", "Street Name A12", 
      "Street Name B26", "Street Name B17", "Street Name C2", "Street Name B6"}
Dim sortedAddresses() As String = address.OrderBy(Function(s) Regex.Match(s, "^\D").Length =0).ThenBy(Function(s) Regex.Match(s, "\D*").Value).ThenBy(Function(s) Int32.Parse(Regex.Match(s,"\d+").Value)).ToArray()

但我不能让它在查询中工作。

甚至在第二个查询中。像这样的东西:

失败:

Dim q2 = query.AsEnumerable().OrderBy(Function(s) Regex.Match(s, "^\D").Length = 0).ThenBy(Function(s) Regex.Match(s, "\D*").Value)

我还看到了一个 MSSQL 查询完成了这项工作,但我宁愿让它在 linq to entity 中工作。

SQL 查询看起来像这样(它完成了工作):

Select StreetAddress, Row_Number() Over (Order by Case When IsNumeric(ID) = 1 then Right(Replicate('0',21) + ID, 20)
                          When IsNumeric(ID) = 0 then Left(ID + Replicate('',21), 20)
                        Else ID
               END) As RowNumber, ID From TblAddress where ID = 103

是的,我已经做了 2 天的谷歌搜索,并在 SO.. 上进行了搜索。到目前为止还没有运气:-(

我还在这里看到了使用 LINQ 进行字母数字排序的解决方案,但我不知道如何解决它。

然后我在 C# 中看到了这个解决方案,但对于 ListBox,现在越来越接近解决方案了(至少我是这么想的……)但是在尝试使它与 RadGrid 一起工作之后,我终于放弃了它。

var list = listBox.Items.Cast<ListItem>()
            .OrderBy(item => int.Parse(item.Text.TrimStart('B')));

listBox.Items.Clear();
listBox.Items.AddRange(list.ToArray()); 

我完全迷失了,到处都没有预期的结果。:)

请协助...

4

1 回答 1

0

您描述的排序称为“自然排序”。如果您想进一步搜索,这应该会有所帮助。我在这里找到了一个带有 LINQ 示例的实现:

http://zootfroot.blogspot.com/2009/09/natural-sort-compare-with-linq-orderby.html?showComment=1258020708758#c5034722582649839449

我以前写过自然排序比较器,但我没有在 LINQ 中使用它们。所以,我很高兴我找到了这个。

于 2013-09-30T02:11:32.493 回答