【问题标题】:Distinct on multiple fields不同领域的区别
【发布时间】:2018-04-18 05:45:50
【问题描述】:

我有一个作为模型的属性列表

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

【问题讨论】:

    标签: c# linq .net-core


    【解决方案1】:

    试试

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

    【讨论】:

    • 使用少量修改 GroupBy(p => new { p.ItemName, p.SubItemName }).Select(g => new SubItemList{ItemName= g.Key.ItemName, SubItemName= g.Key .SubItemName }).ToList();
    • 接受的答案中的查询与您在问题中提出的答案不同。在GroupBy 有问题的帖子中,您只考虑了预计收藏的第一条记录,而忽略了其余的。直到和除非GroupBy SubItemID 表示ItemNameSubItemName 的值相同
    • 当我遇到问题时,SubItemId 将映射到 SubItemName。 ItemName 可以重复,并且可以包含 SubItemName。只是杰克不知道如何在这里获得具有多个字段的组。
    【解决方案2】:

    如果期望是你在问题中所问的,那么下面就是查询:

    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

    要使 Distinct 为类 SubItemList 正常工作,请实现 IEquatable&lt;SubItemList&gt; 或将 IEqualityComparer&lt;SubItemList&gt; 提供给 Distinct

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      相关资源
      最近更新 更多