1

私は2つのデータテーブルを持っています(テーブルの最初の行は次のようになります):

最初のテーブル「違い」:

Person1| 0 | -2 | 1 |8

2 番目のテーブル「年齢」:

Person1| 30 | 20 | 2 | 12

各人に必要な情報は、Top3 'differences' 値 (昇順で並べ替え) で、対応する年齢があります。例えば:

Table Person1:  8 | 1 | 0
                12| 2 | 30

私はSQLクエリでそれを行うことができ、RではListObjectを使用できましたが、vb.netで初めてなので、これらの情報を(Personごとに)取得してvb.netに保存する最良の方法を知りたいです.

4

1 に答える 1

1

匿名型といくつかの linq-fu に満足している場合は、次のようなことを試してください。

Dim differences = New DataTable()
Dim age = New DataTable()
For Each t in {differences, age}
    For Each v in {"Key", "A", "B", "C", "D"}
        t.Columns.Add(v, If(v="Key", GetType(string),GetType(integer)))
    Next
Next

differences.Rows.Add("Person1", 0, -2, 1, 8)
age.Rows.Add("Person1", 30, 20, 2, 12)

differences.Rows.Add("Person2", 4, 5, 6, 7)
age.Rows.Add("Person2", 1, 2, 3, 4)

Dim result = from d_row in differences.AsEnumerable()
             group join a_row in age on a_row("Key") equals d_row("key") 
             into rows = group
             let match = rows.First()
             select new with
             {
                .Key = d_row("key"),
                .Values = d_row.ItemArray.Skip(1).Zip(match.ItemArray.Skip(1), Function(a, b) Tuple.Create(a, b)) _
                                                 .OrderByDescending(Function(t) t.Item1) _
                                                 .Take(3) _
                                                 .ToArray()
             }

結果:

ここに画像の説明を入力

アイデアは、DataTable を結合し、整数値をペアに圧縮し、ペアを並べ替え、各グループの最初の 3 つのペアを取得することです。

より短いがおそらく遅いアプローチは、結合を省略して次のようなものを使用することです

Dim result = from d_row in differences.AsEnumerable()
             let match = age.AsEnumerable().Single(Function(r) r("Key") = d_row("Key"))
             select new with { ... }

例では、簡潔にするために null チェックを省略したことに注意してください。


あなたのコメントに応えて:

 ...
 select new with
 {
    .Key = d_row("key"),
    .Values = d_row.ItemArray.Zip(age.Columns.Cast(Of DataColumn), Function(t, c) Tuple.Create(c.ColumnName, t)) _
                             .Skip(1) _
                             .Zip(match.ItemArray.Skip(1), Function(a, b) Tuple.Create(a.item2, b, a.item1)) _
                             .OrderByDescending(Function(t) t.Item1) _
                             .Take(3) _
                             .ToArray()
 }
于 2013-09-04T11:36:05.773 に答える