Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从列表中选取x个项目,其中每个项目对特定属性都有唯一的值_C#_List_Linq_Core - Fatal编程技术网

C#从列表中选取x个项目,其中每个项目对特定属性都有唯一的值

C#从列表中选取x个项目,其中每个项目对特定属性都有唯一的值,c#,list,linq,core,C#,List,Linq,Core,如果我有一个这样的对象数组 public class Expert { public string Id { get; set; } public int Rating { get; set; } public decimal Price { get; set; } public string Availability { get; set; } } 其中评级可以是以下任意一项:[1,2,3,4,5] 我想从列表中检索5个项目,其中每个项目都有不同的评级 因此,

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

public class Expert
{
    public string Id { get; set; }
    public int Rating { get; set; }
    public decimal Price { get; set; }
    public string Availability { get; set; }
}
其中评级可以是以下任意一项:[1,2,3,4,5]

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


因此,我想以一个包含5个项目的列表结束,其中1的评分为1,另一个评分为2,依此类推到5。

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

您可以使用
GroupBy
然后使用
选择
首先投影
结果

var result = list.GroupBy(x => x.Rating)
                 .Select(x => x.First());
或者正如@Enigmativity在评论中提到的,它提供了一定程度的灵活性

var result = list.GroupBy(x => x.Rating)
                 .SelectMany(x => x.Take(1));
进一步阅读

对序列的元素进行分组

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

返回序列的第一个元素


您知道,从理论上讲,您无法保证每个等级的项目集至少有一个项目。@MichaelRandall我已更新以显示完整的课程大纲。塔里克是的,我知道,如果某些评级不符合要求,它可以返回不到5exist@DanielBrown-请对每条评论回复一个人。虽然
.Select(x=>x.First())
模式在
GroupBy
之后立即起作用,但我建议使用
.SelectMany(x=>x.Take(1))
相反,因为它对插入到
GroupBy
之后的
更加健壮,并且如果需要,它在允许
取(n)
方面更加灵活。换句话说,它在重构时更加健壮。我重视花在管理上的时间。这是我对社区的贡献。在我看来,你的回答只是半个答案。如果有人不知道如何分组并选择每个组的第一个元素,那么他们将不知道该做什么。OP听起来好像他不知道怎么做。如果你提供了代码,那么在我看来,这将是一个完整的答案。@Enigmativity你给了OP表达自己的机会了吗?不,因为你能读心术。你的贡献是阻止积极的贡献。我个人认为,我们应该让人们走上正确的道路,并采取后续行动,而不是填鸭式的喂养。这就是人们学习的方式。无论如何,这种贡献使得Stackoverflow有时是有毒的,并使这个社区出现在模因中。