我有以下两个列表:
var feedbackTaskHistory = _context.FeedbackTasks
.Select(ft => new { ft.Id, ft.DateCreated })
.GroupBy(ai => ai.DateCreated.ToString(@"yyyy-MM-dd"))
.Select(g => new
{
Id = g.Key,
a= g.Where(ad => ad.DateCreated <= Convert.ToDateTime(g.Key)).Count(),
})
.ToList();
//[{Id=2019-11-09, a=3}, {Id=2019-11-10, a=3}, {2019-11-11, a=5}]
var discussionPostHistory = _context.RubricItemScoreComments
.Select(ft => new { ft.Id, ft.RubricItemId, ft.DateCreated })
.GroupBy(ai => ai.DateCreated.ToString(@"yyyy-MM-dd"))
.Select(g => new
{
Id = g.Key,
b= g.Where(ad => ad.DateCreated <= Convert.ToDateTime(g.Key)).Count(),
})
.ToList();
//[{Id=2019-11-10, b=1}, {2019-11-11, b=2}, {2019-11-12, b=1}]我想使用外部连接合并这两个列表,以获得以下列表:
[
{Id=2019-11-09, a=3, b=0},
{Id=2019-11-10, a=3, b=1},
{Id=2019-11-11, a=5, b=2},
{Id=2019-11-12, a=0, b=1},
]我计划使用iterate遍历列表,但这听起来效率不高。我可能在两个列表中都有大约100个项目。我想知道是否有一种性能高效的方法来完成这项任务。有什么建议吗?
发布于 2019-11-13 05:18:37
使用我的Full Outer Join扩展方法,您可以这样做:
var ans = feedbackTaskHistory.FullOuterJoin(discussionPostHistory,
f => f.Id,
d => d.Id,
(key, left, right) => new { Id = key, a = left?.a ?? 0, b = right?.b ?? 0});效率方面,可枚举版本将常规LINQ左外连接与基于HashSet的自定义右反半连接相结合,以生成正确的答案。这确实意味着左和右可枚举项被处理两次。
在这种情况下,您也可以使用我的OrderableFullOuterJoin (为已删除的问题编写),它只枚举每一方一次,但要复杂得多。如果你知道项目是排序的,OrderedFullOuterJoin会更快。无论哪种情况,对于100个项目,我都怀疑是否存在显著的性能差异。
https://stackoverflow.com/questions/58825380
复制相似问题