1

我有一些数据,我根据字符串对象字典列表中的类型生成一个数据表。我遇到的问题是代码检查 Dictionary FirstOrDefault 以构建数据表,但如果这些值中的任何一个为空,事情就会迅速爆炸。

有没有办法我可以采用以下代码并遍历其余的字典值如果特定的键。值在第一组值中为 Null 以尝试找到有效的类型?

我尝试简单地检查并将类型设置为字符串,但如果该列中有任何实际值失败(例如 dateTime 设置为字符串时)。我想遍历所有有问题的 key.Key 类型值,以尝试发现是否有任何单元格具有类型,如果它们都为空,那么该字符串将起作用。

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

2 回答 2

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

        }
于 2013-07-23T22:53:52.780 回答
1

目前尚不清楚您正在尝试什么,但关于 datacolumn beeing null 并找到具有相同密钥的下一个替换您的 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);

因为我们知道它是一个数据列:

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

 }
于 2013-07-23T22:54:25.777 回答