【问题标题】:take x items from list where each one has a unique value for a certain property从列表中取出 x 个项目,其中每个项目对某个属性都有唯一的值
【发布时间】:2020-12-29 12:50:00
【问题描述】:

如果我有一个这样的对象数组:

public class Expert
{
    public string Id { get; set; }
    public int Rating { get; set; }
    public decimal Price { get; set; }
    public string Availability { get; set; }
}

其中 rating 可以是以下任意一项:[1,2,3,4,5]

我想从列表中检索 5 个项目,每个项目都有不同的评分。

所以我想最终得到一个包含 5 个项目的列表,其中 1 的评分为 1,另一个评分为 2,依此类推,最高为 5。

【问题讨论】:

  • 您知道,理论上您无法保证一组项目中每个等级至少有一个项目。
  • @MichaelRandall 我已更新以显示完整的课程大纲。和 Tarik 是的,我知道,如果某些评级不存在,它可以返回小于 5
  • @DanielBrown - 每条评论请回复一个人。

标签: c# list linq .net-core


【解决方案1】:

您可以只使用GroupBy,然后使用Select 投影First 结果

var result = list.GroupBy(x => x.Rating)
                 .Select(x => x.First());

或者正如@Enigmativity 在 cmets 中提到的那样,它提供了一定程度的灵活性

var result = list.GroupBy(x => x.Rating)
                 .SelectMany(x => x.Take(1));

进一步阅读

Enumerable.GroupBy Method

对序列的元素进行分组。

Enumerable.Select Method

将序列的每个元素投影到新的形式中。

Enumerable.First Method

返回序列的第一个元素。

【讨论】:

  • 虽然.Select(x => x.First()) 模式在GroupBy 之后立即起作用,但我建议使用.SelectMany(x => x.Take(1)),因为它对于在GroupBy 之后插入Where 更加健壮并且它如果需要,可以更灵活地允许Take(n)。换句话说,它在重构时更加健壮。
【解决方案2】:

一种可能的解决方案是按等级分组,然后选择每个组的第一个元素。简单可行。

【讨论】:

  • 我很珍惜我花在治安上的时间。这是我对社区的贡献。在我看来,你的答案只有一半。如果有人不知道如何分组并选择每个组的第一个元素,那么他们将不知道该怎么做。 OP听起来他不知道该怎么做。如果您提供了代码,那么我认为这将是一个完整的答案。
  • @Enigmativity 您是否给了 OP 表达自己的机会?不,因为你有能力读心术。你的贡献是阻止积极的贡献。我个人认为,我们应该把人们放在正确的轨道上并跟进,而不是用勺子喂。这就是人们学习的方式。无论如何,这种贡献有时会使 Stackoverflow 变得有毒,并使这个社区出现在模因中。
猜你喜欢
  • 2023-03-17
  • 2014-10-17
  • 2016-09-13
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多