2

私はここで精神的な障害に遭遇しています。明らかな何かが欠けていることを願っています。

とにかく、次のようなテーブルがあるとします。

ID LookupValue ソート順
============================================
1A1000
2 B 2000
3 B 2000
4C 3000
5C 4000

LookupValueLinq を使用して、 が同じであるが並べ替え順序が異なる場所を見つけようとしています(IDはデータベース テーブルの PK であり、この演習には関係ありません)。

LookupValue最も簡単な方法は、とでグループ化し、結果で が 2 回以上出現するSortOrder場所を見つけることだと思いました。LookupValue

現在、グループ化されたテーブルを取得するコードは次のようになります。

Dim KeySortPairs = From d In MyDataTable _
            Group By Key = d(LookupValue).ToString(), SortOrder = d(SortOrder).ToString() _
            Into Group _
            Select Key, SortOrder

デバッグ出力を見ると、上記のコードは次の結果を生成します (これは正しいです)。

キーの並べ替え順序
================
1000
B2000
C3000
C4000

重複を取得するために、Key次のような結果を調べています。

For Each Entry In KeySortPairs.Where(Function(t) t.Key.Count() > 1)
    'Multiple Sort Orders!!'
Next

ただし、このコードでは、グループ化された結果のすべてのエントリが返されます。私は何かを見逃していますか、それともKeyが複数回出現するエントリだけを数えるべきではありませんか? 私は VB.NET に対する私の快適度が低いために些細な間違いを犯していると思いますが、それを理解することはできません - Linq 式Count()の句に を移動しようとしましたが、それでWHERE同じこと。

4

3 に答える 3

2

キーは文字列です。

Key.Count は、文字列内の文字をカウントします。


グループを含めるように選択を変更します

Select Key, SortOrder, Group

where句を変更して、グループをカウントします

KeySortPairs.Where(Function(t) t.Group.Count() > 1)

あるいは、グループを数えるのはやり過ぎかもしれません。"Any" は短い列挙を行うことで時間を節約できます。

KeySortPairs.Where(Function(t) t.Group.Skip(1).Any())

(構文は完璧ではないかもしれません。vb.linq はわかりません)。

于 2008-10-13T15:12:03.260 に答える
0

for each ステートメントに groupby が必要だと思います。

次のようなものを試してください

For Each Entry in KeySortPairs.GroupBy(expression).Where(
于 2008-10-13T15:12:19.357 に答える
0

それは本当に古い質問です。私はちょうど試していました。最初に C# でソリューションを作成し、オンライン コンバーターによって VB.NET に変換しました。希望は誰にも害を与えません。

 Dim tests As New List(Of test)() From { _
            New test() With { _
                Key.LookUp = "A", _
                Key.SortOrder1 = 1000 _
            }, _
            New test() With { _
                Key.LookUp = "B", _
                Key.SortOrder1 = 2000 _
            }, _
            New test() With { _
                Key.LookUp = "B", _
                Key.SortOrder1 = 2000 _
            }, _
            New test() With { _
                Key.LookUp = "C", _
                Key.SortOrder1 = 3000 _
            }, _
            New test() With { _
                Key.LookUp = "C", _
                Key.SortOrder1 = 4000 _
            } _
        }

  Dim query = From g In From t In testsGroup t By t.LookUpLet firstsortorder = g.First() Where g.Count() > 1 AndAlso g.Any(Function(t1) firstsortorder.SortOrder1 <> t1.SortOrder1)New With { _
  g.Key, _
  Key .result = g _
}

    For Each item As var In query
        Console.WriteLine("key " + item.Key)
        For Each item1 As var In item.result
            Console.WriteLine(vbTab & vbTab & "sort order " + item1.SortOrder1)
        Next
    Next
于 2015-07-02T15:49:53.403 に答える