使用linq标准化对象

ada*_*101 3 c# linq

我有IEnumerable<RuleSelection>这些属性:

public class RuleSelection{
  public int RuleId { get; set;}
  public int? CriteriaId { get; set; }
  public int? CriteriaSourceId{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

RuleIdin RuleSelection并不是唯一的.

我可以写一个linq查询来规范化这些IEnumerable<Rule>将是:

public class Rule{
  public int RuleId { get; set; }
  public IEnumerable<int> Criteria { get; set; }
  public IEnumerable<int> CriteriaSource { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Rule.RuleId将是唯一的和属性Criteria,CriteriaSource并将分别包括所有CriteriaId's和CriteriaSourceId's RuleId.

Jon*_*eet 10

这听起来像你想要的东西:

var rules = selections.GroupBy(rs => rs.RuleId)
                      .Select(g => new Rule {
                                  RuleId = g.Key,
                                  Criteria = g.Select(rs => rs.CriteriaId)
                                              .Where(c => c != null)
                                              .Select(c => c.Value)
                                              .ToList(),
                                  CriteriaSource = g.Select(rs => rs.CriteriaSourceId)
                                                    .Where(c => c != null)
                                                    .Select(c => c.Value)
                                                    .ToList(),
                              });
Run Code Online (Sandbox Code Playgroud)