假设我有一个数字列表,可以是任何数量,实际上超过15。
我想将这些数字列表分成三组,具体取决于它们的大小,例如小,中,大。
实现这一目标的最佳方式是什么?
我已经写了下面的内容,是否有必要按照下面的说法制作我自己的功能,或者我可以在.NET中使用哪些功能?
public static List<int> OrderByThree (List<int> list)
{
list.Sort();
int n = list.Count();
int small = n / 3;
int medium = (2 * n) / 3;
int large = n;
// depending if the number is lower/higher than s/m/l,
// chuck into group via series of if statements
return list;
}
示例
假设我有一个数字列表,例如1-15,我想要1-5个小型,6-10个中型和11-15个大型。但是我不会知道一开始的数字量,没有戏剧,使用list.count
我希望除以我自己的功能。
答案 0 :(得分:6)
由于您已经对列表进行了排序,因此您可以使用一些LINQ来获取结果。我在这里假设一个右关闭区间。
list.Sort();
int n = list.Count();
var smallGroup = list.TakeWhile(x => (x <= n / 3)).ToList();
var middleGroup = list.Skip(smallGroup.Count).TakeWhile(x => (x <= (2 * n) / 3)).ToList();
var largeGroup = list.Skip(smallGroup.Count + middleGroup.Count).ToList();
修改强>
正如 Steve Padmore 所评论的那样,您可能希望从方法中返回列表(List<List<int>>
),而不仅仅是List<int>
。
return new List<List<int>> { smallGroup, middleGroup, largeGroup };
答案 1 :(得分:3)
这是一种简单的方法:
var result = list.GroupBy (x =>
{
if(x <= small) return 1;
if(x <= medium) return 2;
return 3;
});
或者:
var result = list.GroupBy (x => x <= small ? 1 : x <= medium ? 2 : 3);
(这不需要对列表进行排序)