2016-08-09 21 views
1
私が授業している

LINQ動的リスト

Public Class Data 

    Public Property ColumnList As List(Of Column) 
    Public Property RowList As List(Of Row) 
End Class 

Public Class Row 

    Public Property CellList As List(Of Cell) 
End Class 

Public Class Column 

    Public Property name As String 
End Class 

Public Class Cell 

    Public Property value As Object 
    Public Property col As Column 
End Class 

その後、私はれる列名のリストは、例えば、データのために(SQLのように)主キーになるかどうかを確認したいです

ColumnFieldNames = {"FieldA", "FieldB"} 

ColumnListFieldAという名前の3 Column秒、FieldBFieldCが含まれています。 RowListは、それぞれFieldA,FieldB,およびColumnの値で満たされた3つのCellListを含みます。

Data.ColumnList(0).name = "FieldA" 
Data.ColumnList(1).name = "FieldB" 
data.RowList(0).CellList(0).value = 1 
data.RowList(0).CellList(0).column = ColumnList(0) 
data.RowList(0).CellList(1).value = 2 
data.RowList(0).CellList(1).column = ColumnList(1) 
data.RowList(1).CellList(0).value = 34 
data.RowList(1).CellList(0).column = ColumnList(0) 
data.RowList(1).CellList(1).value = 2 
data.RowList(1).CellList(1).column = ColumnList(1) 

など

私はgroup by ... having count(*) > 1 またはselect count(1)のいくつかの種類たい - 私はCellList.value = 2を含む複数の行があるとして、それは、何かを返しますFieldBColumnFieldNamesとして選択するかのように、声明を。 {"FieldA"、 "FieldB"}をColumnFieldNamesとして選択すると、何も返されません。

答えて

1

私は主な目的は、フィールドのセットがあなたのデータ構造の主キーを表しているかどうかをチェックすることです。言い換えれば、フィールドのセットが一意に行を識別できる場合。

FloatingKiwiが指摘したように、DataTableクラスを使用する方がよいでしょう。それはあなたのデータを格納し、操作するための便利なユーティリティの数を提供します。

Private Function IsPK_DataTable(data As DataTable, ParamArray fields As String()) As Boolean 
    Return New DataView(data).ToTable(True, fields).Rows.Count = data.Rows.Count 
End Function 
ここ

データが最初に私たちは(ToTable(..., fields)で)我々のデータテーブルからのみ選択された列を拾うことができますDataViewオブジェクトでラップされている行のみ:あなたの質問は、この単純なコードで回答することができますこれらの選択された列で一意です(最初のパラメーターとしてTrueToTable()に渡すことによって)。ここで、結果の行数が最初の列数と一致する場合、渡されたフィールドセットはデータの主キーになる可能性があります。

完全なデモコードはここで見つけることができます:https://dotnetfiddle.net/6fhMgv


をカスタムデータ構造表現を使用して、あなたはまだ傾いている場合、それぞれの主キーのチェック機能は、次のようになります。

Private Function IsPK_CustomData(data As Data, ParamArray fields As String()) As Boolean 
    Dim keyValues = data.RowList _ 
     .[Select](Function(r) r.CellList.Where(Function(c) fields.Contains(c.col.name)) _ 
     .[Select](Function(c) c.value).ToArray()).ToArray() 
    For i As Integer = 1 To keyValues.Length - 1 
     For j As Integer = i - 1 To 0 Step -1 
      If keyValues(i).SequenceEqual(keyValues(j)) Then 
       Return False 
      End If 
     Next 
    Next 
    Return True 
End Function 

フルデモ:https://dotnetfiddle.net/RDl5Nl

1

あなたはここでホイールを再生産しているようです。 DataTableクラスはクラス構造を既に処理でき、SQL式のフィルタ式をサポートしています。グループ化のために、以下の投稿をチェックしてみてください: Efficient DataTable Group By

+0

古いホイールが丸すぎました。 –