2010-08-13 12 views
5

Mam słownik (patrz poniżej), który ma ciągi znaków i ciągi wartości i chcę mieć możliwość dołączenia tego słownika do mojego zestawu danych przy użyciu klucza słownika (równoważne unikalne pole w zestawie danych jest nazwany Network_ID). Jak mogę to zrobić? Mam nadzieję na nowy datatable, który ma oryginalne dane datatable, a także dwie dodatkowe kolumny danych (klucz i wartość ze słownika). Dziękuję bardzo.Łączenie słownika z datowalnym

Mój słownik jest tego typu: Dictionary<string, string> input = new Dictionary<string, string>();

Zmieniano:

  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(); 
      } 

     } 

Odpowiedz

1

Można to osiągnąć, dodając dwie kolumny do tabeli danych i zapętlając wiersze w celu wypełnienia.

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

Ponieważ dostęp do słownika jest zamortyzowany O (1), łączne łączenie ma liniową wydajność.

+0

Hi kbrimington Wziąłem swoje sugestie i dokonał kilku zmian, ale po zmiany są wprowadzane do mojego datatable i próbuję wydrukować każdą kolumnę i wiersz do pliku tekstowego, moje inne kolumny danych wychodzą dobrze, ale nowe kolumny nie wyświetlają czytelnych danych. To, co widzisz poniżej: System.Collections.Generic.Dictionary'2 + ValueCollection [System.String, System.String] – Josh

+0

nevermind, myślę, że mam to teraz. dzięki – Josh

0

O ile mi wiadomo, przy założeniu, że używasz klasę DataTable, nie można dołączyć do słownika do swojego przedmiotu.

Można utworzyć nowy DataTable (W ciągu DataSet) i przenieść zawartość Słownika do nowej tabeli, można dołączyć nowe kolumny do DataTable czy mógłbyś, jeśli miałoby to przez zastosowanie do danej sytuacji, należy użyć Zapytanie LINQ i dołączenie do kwerendy LINQ w celu utworzenia anonimowego typu (lub utworzenia nowego typu, który reprezentuje połączone dane) i połączenia i użycia danych w ten sposób.

Należy pamiętać, że żadna z nich nie będzie w stanie powrócić do bazy danych, jeśli zachodzi potrzeba zatrzymania tych informacji. To wszystko byłoby przejściowe w twojej aplikacji.

2

To dość łatwe (z LINQ), choć wynik nie będzie DataTable, ale IEnumerable nowej anonimowej klasy.

 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 
        }; 

Mam nadzieję, że powinien dostać idziesz :) Jeśli potrzebujesz tabeli danych, musisz utworzyć nową z result tej kwerendy LINQ.

0

coś podobnego:

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() jest metodą Extension, można użyć czystego kodu:

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;}); 
}