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()

しかし、クエリで機能させることはできません。

または、2 番目のクエリでも。このようなもの:

失敗:

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

作業を行ったMSSQLクエリも見ましたが、エンティティへのlinqで動作するようになりました。

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 を使用した Alphanumeric sortingのソリューションへの道も見ましたが、解決方法がわかりませんでした。

それから、C# でこのソリューションを見ましたが、ListBox の場合は、ソリューションに近づきました (少なくともそれは私が思っていたことです...)。

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 に答える