通过除这些对象的属性之外的其他内容对对象列表进行分组

时间:2015-02-06 23:51:15

标签: c# linq

如何通过除这些对象的属性之外的其他内容对对象列表进行分组?我需要分组列表统计信息。列表中的每个对象都有属性字符串问题,对于每个问题,我都有一些可能的答案,我希望将列表分组(每个组具有相同的可能答案),但这些可能的答案与Statistics类没有直接关系。

我想做这样的事情:

var customGroups = from stat in statistics group stat by new { PossibleAnswers = questions.SingleOrDefault(q => q.Text == stat.Question).PossibleAnswers };
foreach (var group in customGroups)
{
   StatisticsWithSamePossibleAnswers.Add(group.ToList());
}

代码提供运行时异常:对象引用未设置为对象的实例。

那么这样做的好方法是什么?我知道我总是可以使用嵌套的foreach循环,但有什么更明智的吗?

课程统计和问题如下:

public class Statistics
{
    public int ID { get; set; }
    public int Year { get; set; }
    public int Semester { get; set; }
    public string Subject { get; set; }
    public string Question { get; set; }
    public bool IsAssociatedWithProfessor { get; set; }
    public bool IsAssociatedWithAssistant { get; set; }
    public string Answer { get; set; }
    public int NumberOfAnswers { get; set; }
    public double AnswerPercentage { get; set; }
    public double? AM { get; set; }
    public double? SD { get; set; }
}
public class Question
{
    public int ID { get; set; }
    public string Text { get; set; }
    public bool IsAssociatedWithProfessor { get; set; }
    public bool IsAssociatedWithAssistant { get; set; }
    public virtual ICollection<PossibleAnswer> PossibleAnswers { get; set; }
    public virtual ICollection<Results> Results { get; set; }
}

2 个答案:

答案 0 :(得分:3)

可以使用正确的相等比较器对

HashSet<T>进行分组。

var customGroups = statistics.GroupBy(
    stat => new HashSet<PossibleAnswer>(questions.Single(q => q.Text == stat.Question).PossibleAnswers),
    HashSet<PossibleAnswer>.CreateSetComparer());

请注意,这会忽略答案顺序和重复的答案。这也假设PossibleAnswer默认是等同的。

答案 1 :(得分:2)

为了在group by查询中使用某些东西作为关键字,它必须是可以进行相等性比较的东西。列表不被考虑&#34;平等&#34;仅仅因为它们具有相同的值,所以您希望将可能的答案列表转换为更具可比性的答案。在下面的代码示例中,我使用string.Join()生成逗号分隔的答案字符串,但您可以根据需要进行调整。

var customGroups = from stat in statistics 
    group stat by string.Join(", ", 
        from q in questions
        where q.Text == stat.Question
        select q.PossibleAnswers);
foreach (var group in customGroups)
{
   StatisticsWithSamePossibleAnswers.Add(group.ToList());
}

另请注意,通过删除SingleOrDefault(),我可以避免遇到没有匹配问题的stat时遇到的问题,并获得空引用异常。相反,你应该得到一个空字符串来分组。