我有一些数据通过,我根据字符串对象的字典列表中的类型生成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);
}
}
}
}
答案 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);
}
}
}