2013-07-23 33 views
1

我有一些數據來自並且我基於字符串對象的字典列表中的類型生成dataTable。我遇到的問題是代碼檢查Dictionary FirstOrDefault來構建數據表,但如果其中任何值爲null,則很快就會炸燬。如果FirstOrDefault爲空,則通過字典循環來查找dataType

有沒有一種方法,我可以採取下面的代碼,並遍歷剩餘的字典值如果一個特定的key.Value是空的那些第一組值中試圖找到一個有效的類型?

我試着簡單地檢查並設置類型爲字符串,但是如果該列中有任何實際值失敗(例如dateTime設置爲字符串時)。我想遍歷所有key.Key類型的值,試圖發現是否有任何單元格有類型,如果它們全都爲null,那麼該字符串將工作。

public DataTable(IEnumerable<Dictionary<string, object>> source) 
    { 
     if (source != null) 
     { 
      var firstItem = source.FirstOrDefault(); 

      if (firstItem != null) 
      { 
       //foreach (var item in source) 
       //{ 

       // var u = item.Values; 
       // var t = item.Keys; 

       //} 
       foreach (var key in firstItem) 
       { 
        if (key.Value == null) //check if value is null and try and find the next value for that key.Key that isn't 
        { 
         foreach (var item in source) 
         { 
          var kk = key.Key; 
          var ik = item.Keys; 

         } 

         //...some logic to try and find if the key.Key Value in question has any legitimate value other than null to set the DataType to 


         //set value to some type here to avoid things blowing up. 
         Columns.Add(new DataColumn() { ColumnName = key.Key, DataType = typeof(string) }); 
        } 
        else 
        { 
         Columns.Add(new DataColumn() { ColumnName = key.Key, DataType = key.Value.GetType() }); 
        } 
       } 

       foreach (var item in source) 
       { 
        var row = new DataRow(); 

        foreach (var key in item) 
        { 
         row[key.Key] = key.Value; 
        } 
        Rows.Add(row); 
       } 
      } 
     } 
    } 
+0

是你的方法聲明一樣,或者是一個錯字?它必須是或否則它不會編譯。 – terrybozzio

+0

你有一個詞典的集合?你的描述很混亂,你的代碼很複雜。你能否提供一些代碼來顯示你的字典集合是什麼樣的?並更清楚地解釋你想完成什麼? –

回答

1

因此,如果您只得到你的鑰匙啓動,然後拉出第一個非空值對每個鍵,它應該簡化你的邏輯(儘管它可能是有點多工藝精深):

if (source != null) 
    { 
     var keys = (from d in source 
          from k in d.Keys 
          select k).Distinct(); 
     foreach (var key in keys) 
     { 
      //...some logic to try and find if the key.Key Value in question has any legitimate value other than null to set the DataType to  
      var thisKey = key; 
      var valueNotNull = source.FirstOrDefault(dictionary => dictionary[thisKey] != null); 
      var colType = valueNotNull != null ? valueNotNull[thisKey].GetType() : typeof(string); 


      dt.Columns.Add(new DataColumn() 
      { 
       ColumnName = thisKey, 
       DataType = colType 
      }); 

     } 
+1

完美,我知道有一個LINQ方法來迭代傳入的字典。我必須開始努力學習它。感謝您的解決方案。 – Trag

1

它不清楚你正在嘗試,但有關的DataColumn beeing空,找到具有相同的鍵取代你的foreach下一:

foreach (var item in source) 
{ 
    var kk = key.Key; 
    var ik = item.Keys; 
} 

有了這個:

var notnul = source.FirstOrDefault(x => x.ContainsKey(key.Key) && x[key.Key] != null); 

而且因爲我們知道它的DataColumn:

Columns.Add((DataColumn)notnul.Values.First()); 

var row = new DataRow();將會給你帶來麻煩,可以考慮這樣做:

foreach (var item in source) 
{ 
    //var row = new DataRow(); 

    foreach (var key in item) 
    { 
      if (key.Value is DataRow) 
      { 
       DataRow row = (DataRow)key.Value; 
       Rows.Add(row); 
      } 
    } 

} 
+0

thx爲你的幫助特里。我需要遍歷整個字典來確定每組數據的類型是什麼。因此,如果列鍵2有一個空值,我需要找到key2的下一個值,並查看它是否爲空等等,並且要麼確定它們全都爲空,要麼在鏈的某個位置存在合法值。 – Trag