Я предлагаю группировать результат по DataSeriesId
.
var groupedResult = QueryDatabase().GroupBy(item => item.DataSeriesId);
Теперь вы можете получить доступ к сгруппированным данным следующим образом. В этом примере будут напечатаны все группы со всеми элементами.
foreach(var group in groupedResult)
{
Console.WriteLine("Group: " + group.Key);
foreach(var item in group)
{
Console.WriteLine(" Item: " + item);
}
}
Или вы можете сгруппировать результат запроса базы данных в список списков.
IList<IList<DataItem>> = QueryDatabase()
.GroupBy(item => item.DataSeriesId)
.Select(group => group.ToList())
.ToList();
Или вы можете создать словарь из DataSeriesId
в список элементов данных из результата запроса к базе данных.
IDictionary<Int32, IList<DataItem>> = QueryDatabase()
.GroupBy(item => item.DataSeriesId)
.ToDictionary(group => group.DataSeriesId, group => group.ToList());
Или использовать Enumerable.ToLookUp()
, если вы не хотите, чтобы изменить словарь позже.
UPDATE
Просто заметил, "Лучшая практика" в вопросе АН "DataReader" тега. Хорошо LINQ легко писать и легко получить право, но это, вероятно, не самое быстрое решение. Поэтому в зависимости от ваших требований использование LINQ может быть хорошим или плохим выбором. Я бы предпочел LINQ, если производительность пока еще не проблема. В противном случае я бы подумал о создании словаря от DataSeriesId
до списка элементов данных при чтении данных.
IDictionary<Int32, IList<DataItem>> result =
new Dictionary<Int32, IList<DataItem>>();
while (dataSource.DataAvailiable)
{
DataItem item = dataSource.ReadItem();
IList<DataItem> items;
if (!result.TryGetValue(item.DataSeriesId))
{
items = new List<DataItem>();
result.Add(item.DataSeriesId, items);
}
items.Add(item);
}