在多个领域有所区别

时间:2018-04-18 05:45:50

标签: c# linq .net-core

我有一些属性列表作为模型

public class AnswerList {
    public int ID { get; set; }
    public int? Schedule_ID { get; set; }
    public int? SubItemID { get; set; }
    public string SubItemName { get; set; }
    public string ItemName { get; set; }
    public string Answer { get; set; }
    public string Remarks { get; set; }
    public string Remarks_Flag { get; set; }
    public string Lattitude { get; set; }
    public string Longitude { get; set; }
    public DateTime? Load_Date { get; set; }
}

我从此列表中获取了不同子项目列表

List<string> sub_item_list = AnswerList.Select(x => x.SubItemName).Distinct().ToList();

现在我想要按照以下类别

的不同格式的数据
public class SubItemList {
    public string ItemName { get; set; }
    public string SubItemName { get; set; }
}

我的要求是使用各自的项目名称获取不同的子项目,子项目应该是不同的,但项目名称可以重复,因为一个项目可以包含多个子项目

Distinct不适用于多个值,所以我尝试了

List<SubItemList> SI_List = 
                 AnswerList.GroupBy(d => d.SubItemID)
                           .Select(x => 
                               new SubItemList 
                         { 
                          ItemName = x.Select(a => a.ItemName).First(), 
                          SubItemName = x.Select(a => a.SubItemName).First() 
                         }).Distinct().ToList();

这样我就能得到我想要的东西,但我认为这不是一个更好的方法, Linq表达了另一个Linq表达式

如何使用简单的Linq表达式获取它?

我正在使用ASP.Net Core 2.0

2 个答案:

答案 0 :(得分:1)

尝试

GroupBy(
        p => new {p.ItemName, p.SubItemName}
       ).Select(g => new { g.Key.ItemName, g.Key.SubItemName });

答案 1 :(得分:1)

如果期望是您在问题中提出的要求,那么以下是查询:

AnswerList.GroupBy(d => new { d.SubItemID, d.ItemName, d.SubItemName})
                         .Select(x => new SubItemList{
                                     ItemName = x.Key.ItemName, 
                                     SubItemName =x.Key.SubItemName
                            }
                  ).Distinct();
  

工作原理

  1. GroupBy SubItemIDItemNameSubItemName的唯一组合,将形成分组键
  2. 现在只选择ItemNameSubItemName创建SubItemList并调用Distinct即可在SubItemID
  3. 中删除重复项

    要让Distinct能够正确使用课程SubItemList,请实施IEquatable<SubItemList>或向{Dist>提供IEqualityComparer<SubItemList>