2009-02-25 15 views
6

これは完全に基本的な質問のように感じますが、私の人生の間、私はエレガントな解決策を考え出すことはできません。LINQ to Objects自動インクリメント番号

基本的には、クエリから新しいオブジェクトを作成するLINQクエリを実行しています。新しいオブジェクトでは、後で使用するために選択オーダーを保持できるように自動増分番号を生成したいとします(この例ではIterという名前です)。

Dim query2 = From x As DictionaryEntry In MasterCalendarInstance _ 
       Order By x.Key _ 
       Select New With {.CalendarId = x.Key, .Iter = 0} 

    For i = 0 To query2.Count - 1 
     query2(i).Iter = i 
    Next 

私はループにした後、コレクションを持たないようにLINQクエリのコンテキスト(内これを行う方法があります:ここで

は何が必要ないというのが私の現在のソリューションでありますクエリ)?

答えて

29

恩赦私VB.NETでの正確な構文わからないC#でこれを行うために:

MasterCalendarInstance 
    .OrderBy(x => x.Key) 
    .Select((x, ixc) => new { CalendarId = x.Key, Iter = ixc }); 
+0

これは私の問題をどのように解決するのかよくわかりません。 ixcの値はどのように設定され、自動インクリメントされますか? – Nathan

+3

自動的に:)それはFunc を取る.Select拡張メソッドのオーバーロードです(http://msdn.microsoft.com/en-us/library/bb534869.aspxを参照) – veggerby

+0

ありがとう私の問題を解決しました。私は助けに感謝します! – Nathan

7

これはVBで可能であるならば、私は知らないが、C#で1クロージャを使用しています:

+0

は、他の回答を参照してください。これは/ /可能です... – Richard

+0

これが私の最初の傾き(Gerneralyだった、私は、AC#の男です)。しかし、私は++のvb.net版は認識していません。私はこれを処理するデリゲートメソッドを利用したいと思っていましたが、それは私がそのような単純なタスクで好むより複雑なものを追加します。 – Nathan

+1

+1これは、ラムダ構文ではなくクエリ構文でコードを保持したい場合に機能します。 – Douglas

0

List(Stringの)で同様の問題を解決しようとしているうちに、このポストを実行しました。

問題を解決するために採用されることを期待して回避策を掲載していますが、List(Of T)でこの問題にぶつかる他のユーザーにとっては、

Dim list As New List(Of String) 
list.Add("Test1") 
list.Add("Test2") 
list.Add("Test3") 

Dim var = list.Select(Function(s) New With {.Name = s, .RecordID = list.IndexOf(s)}) 

希望します。

1

上記の解決策は次のようにVB.NETでまとめることができます

MasterCalendarInstance _ 
    .OrderBy(Function (x) x.Key) _ 
    .Select(Function (x, ixc) New With { .CalendarId = x.Key, 
             .Iter = ixc }) 
関連する問題