【发布时间】:2009-01-13 00:06:29
【问题描述】:
我是 LINQ 的新手...
我有一个 IEnumerable 通用列表,其中包含不同版本的答案(每个版本都有问题的 FK)。从此列表中,我只需要获取最新版本答案的字典。
一个非常简化的类图:
问题
-ID
-问题
- ...其他属性
回答
-ID
-版本
-问题ID
-价值
- ...其他属性
目前我有以下内容:
IEnumerable<Answer> answers = GetAnswers();
IDictionary<long, AnswerDTO> latestVersionAnswers = new Dictionary<long, AnswerDTO>();
if (answers != null)
{
latestVersionAnswers = answers
.OrderBy(e => e.ID)
.GroupBy(e => e.Question.ID)
.Select(g => new AnswerDTO
{
Version = g.Last().Version, // g.Select(e => e.Version).Max(),
QuestionID = g.Key,
ID = g.Last().ID,
Value = g.Last().Value
}).ToDictionary(c => c.QuestionID);
}
虽然这在大多数情况下都有效,但您可以很快看到它需要一些认真的优化(并且有点脆弱,因为它取决于答案记录行顺序而不是“最大”逻辑)。使用 LINQ 执行此操作的最佳方法是什么,或者最好为每个循环执行多个?
- 如果我只需要版本(而不是 ID、值等),我就不需要 OrderBy,因为我可以只使用 g.Select(e => e.Version).Max()(或者我'现在已经看到C# List<> GroupBy 2 Values 的帖子,但这又只会返回密钥和一个属性:版本)。
- 最终,在这种特殊情况下,我更愿意只“过滤”原始列表并返回原始答案项,而不是涉及 AnswerDTO。
任何指点或帮助将不胜感激!
【问题讨论】: