如果FirstOrDefault为Null,则循环遍历Dictionary以查找dataType

时间:2013-07-23 21:37:32

标签: c# types dictionary

我有一些数据通过,我根据字符串对象的字典列表中的类型生成dataTable。我遇到的问题是代码检查Dictionary FirstOrDefault来构建数据表,但如果这些值中的任何一个是空的,那么事情会很快爆炸。

有没有办法我可以使用下面的代码并迭代其余的字典值,如果一个特定的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);
                }
            }
        }
    }

2 个答案:

答案 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 :(得分:1)

目前还不清楚你在尝试什么,但关于数据库是否为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);
          }
     }

 }