1

通過するデータがいくつかあり、文字列オブジェクトの辞書リストの型に基づいて dataTable を生成します。私が抱えている問題は、コードが Dictionary FirstOrDefault をチェックしてデータテーブルを構築することですが、これらの値のいずれかが null の場合、すぐに爆発します。

次のコードを取得して、特定のキーの場合、残りの辞書値を反復処理する方法はありますか?

タイプを単純に確認して文字列に設定しようとしましたが、その列に失敗する実際の値が含まれている場合(たとえば、文字列に設定されている場合の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);
                }
            }
        }
    }
4

2 に答える 2

1

そのため、キーのみを取得することから始めて、各キーの最初の非 null 値を取得すると、ロジックが簡素化されます (ただし、プロセスが少し集中する可能性があります)。

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

あなたが何をしようとしているのかは明らかではありませんが、データ列が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 に答える