我正在开展一个旨在为统计目的提取和处理数据的项目。 假设我有许多元素“E”,每个元素都有一个字段列表{F1,F2,F3,...}。 我的主表如下所示:
我需要通过elementID将数据提取到数据表中,并将“Date”作为Key。
[{"key": "date1",
"F1": "value",
"F2": "value"}
,{"key": "date2",
"F1": "value",
"F2": "value"}
,{"key": "date3",
"F1": "value",
"F2": "value"}
,{....}]
我目前的实现是下一步:
1)按字段查询数据库,并在Dictionary<DateTime, double>
2)检查并填写每个Dictionary
中的缺失值。
3)循环浏览列表或按Dictionary
按键并逐行填充DataRow
。
我不认为这是最终的解决方案,我一直在努力优化代码。但我不确定我应该关注哪一层。是否有任何可能的方法来使用select from database获取所需的结构(无需进一步循环)?
答案 0 :(得分:0)
不是很清楚,但是,我假设您想要按DateTime
的日期部分进行分组,并选择一个字典,其中此日期为关键字,值为List<double>
。
然后你根本不需要DataTable
。而不是double
我将使用具有所有属性的自定义类。假设mainTable
已经是DataTable
原始数据:
public class ElementMeasurement
{
public Element Element { get; set; }
public double Value { get; set; }
public string Field { get; set; }
public DateTime Date { get; set; }
}
public class Element
{
public int ElementID { get; set; }
public string Name { get; set; }
}
现在,您可以使用属于Enumerable.GroupBy
的<{1}}:
System.Linq
编辑:“好吧,我应该让你知道它是一张有数千英里行的巨大桌子!”
我不知道桌子还没有在内存中。那么这可能太贵了。因此,DataReader上的循环可以产生按Date排序的行更有效。然后你仍然可以使用我上面的类来保持它的可读性和可维护性,但是逐步填充字典。
例如(假设SQL-Server):
Dictionary<DateTime, List<ElementMeasurement>> dateMeasurements = mainTable.AsEnumerable()
.GroupBy(row => row.Field<DateTime>("Date").Date)
.ToDictionary(g =>
g.Key,
g => g.Select(row => new ElementMeasurement
{
Element = new Element { ElementId = row.Field<int>("ElementId") },
Field = row.Field<string>("Field"),
Value = row.Field<double>("Value"),
TimeOfMeasurement = row.Field<DateTime>("Date")
}).ToList()
);