【问题标题】:How can i do Group by an property and get first record from any groups with lambda linq?如何按属性分组并从任何使用 lambda linq 的组中获取第一条记录?
【发布时间】:2020-04-01 14:56:44
【问题描述】:

我的对象(照片)有 3 个属性(ID、姓名、照片)

身份证件姓名照片 *********************** 1个1.jpg 2个2.jpg 3 b 3.jpg 4 b 4.jpg 5 c 5.jpg ************************* 如何使用 linq lambda 在 groupby(name) 中获取第一条记录?如下表 身份证件姓名照片 ************************ 1个1.jpg 3 b 3.jpg 5 c 5.jpg ***********************

我使用这个代码:

photos.GroupBy(x => x.Name).FirstOrDefault();

但结果只是 (name:a),我需要 (ID,Name,Photo) 值

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 好像回复here

标签: c# asp.net-mvc linq asp.net-core lambda


【解决方案1】:
photos.GroupBy(p => p.Name).Select(p => p.First()).ToList();

【讨论】:

  • 我建议一个更好的版本:photos.GroupBy(p => p.Name).SelectMany(p => p.Take(1)).ToList();。如果在Select 中的p 上使用过滤器,这种方法可以进行更好的重构。所以是这样的:photos.GroupBy(p => p.Name).SelectMany(p => p.Where(x => x.ID > 3).Take(1)).ToList();
【解决方案2】:

当您执行GroupBy() 时,结果是IGrouping<,>s 中的IEnumerable。在您的情况下,它将是IGrouping<string, Photo>。因此,当您尝试访问第一个元素时,您获得的不是第一个 Photo,而是第一个 IGrouping,在示例中将包含两个元素。

获得第一组的第一个Photo 的正确方法是这样的:

var firstGroup = photos.GroupBy(x => x.Name).OrderBy(y => y.Key).First(); //or FirstOrDefatult() if you prefer
Photo firstPhotoInGroup = firstGroup.First(); 

获得组后,您可以像使用 IEnumerableKey 属性一样使用它。

【讨论】:

    【解决方案3】:

    我认为您可能需要与接受的答案不同的答案 - 接受的答案是假设列表已经按照它需要的顺序(按 ID)排序并获取第一个。以下解决方案按名称分组,然后按 ID 获取该组中的最小值并重新组合:

    IEnumerable<MetaPhoto> minPhotos = photos
        .GroupBy(photo => photo.Name)
        .SelectMany(photoGroup => photoGroup, (photoGroup, photo) => new { PhotoGroup = photoGroup, Photo = photo })
        .Where(photoGroupPhoto => photoGroupPhoto.Photo.ID == photoGroupPhoto.PhotoGroup.Min(photo => photo.ID))
        .Select(photoGroupPhoto => photoGroupPhoto.Photo);
    

    【讨论】:

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