5


0

辞書をデータテーブルに結合する

キー文字列と値文字列を持つディクショナリ(下記参照)があり、ディクショナリキーを使用してこのディクショナリをデータテーブルに結合できるようにしたい(Datatableの同等の一意のフィールドはNetwork_IDと呼ばれます)。 これどうやってするの? 元のデータテーブル情報と2つの追加データ列(ディクショナリのキーと値)を含む新しいデータテーブルを期待しています。 どうもありがとう。

私の辞書はこのタイプです: Dictionary input = new Dictionary();

編集:

         dt.Columns.Add("Key");
         dt.Columns.Add("KeyValue");

        foreach (System.Data.DataRow row in dt.Rows)
        {
            var networkID = (string)row["Network_ID"];

            if(input.ContainsKey(networkID))
            {
                row["Key"] = networkID.ToString();
                row["KeyValue"] = input.Values.ToString();
            }

        }

4 Answer


2


結果はDataTableではなく、新しい匿名クラスのIEnumerableになりますが、かなり簡単です(LINQを使用)。

       var result = from myDataRow in myDataTable.AsEnumerable()
                    join myKeyValuePair in myDictionary
                    on myDataRow.Field("Network_ID") equals myKeyValuePair.Key
                    select new {
                        NetworkID = myDataRow.Field("Network_ID"),
                        ... /* other DataTable row values here */,
                        DictionaryKey = myKeyValuePair.Key,
                        DictionaryValue = myKeyValuePair.Value
                    };

データテーブルが必要な場合は、このLINQクエリの「結果」から新しいテーブルを作成する必要があります。


1


これを実現するには、2つの列をデータテーブルに追加し、行をループして入力します。

foreach (DataRow row in table.Rows)
{
    var networkID = (string)row["Network_ID"];
    if (input.ContainsKey(networkID))
    {
        row["NewKeyColumn"] = networkID;
        row["NewKeyValue"] = input[networkID]
    }
}

辞書アクセスは償却O(1)であるため、合計結合のパフォーマンスは線形になります。


0


私が知る限り、 `DataTable`クラスを使用していると仮定すると、オブジェクトに辞書を結合することはできません。

DataSet`内で)新しい DataTable`を作成し、ディクショナリの内容を新しいテーブルに転送したり、新しい列を `DataTable`に追加したり、状況に応じて、 LINQクエリとLINQクエリ内の結合を使用して匿名型を作成し(または、結合されたデータを表す新しい型を作成できます)、その方法でデータを結合して使用します。

この情報を永続化する必要がある場合、これらのいずれもデータベースに戻ることができないことに注意してください。 これはすべて、アプリケーション内で一時的なものです。


0


似たような:

var result = dt.AsEnumerable()
                .Join(id2itm.Keys,
                        row => row[idScColIdx],
                        id => id,
                        (row, id) => row)
                .Each(ro => {ro[idClmName] = FlagChar;
                            ro[idColorClmName] = FlagColor;});

My Each()は拡張メソッドです。純粋なコードを使用できます。

var result = dt.AsEnumerable()
                .Join(id2itm.Keys,
                        row => row[idScColIdx],
                        id => id,
                        (row, id) => row);

foreach (var ro in result)
{
               ro[idClmName] = FlagChar;
               ro[idColorClmName] = FlagColor;});
}