List <int>分为三部分

时间:2015-10-20 17:12:00

标签: c# linq list

假设我有一个数字列表,可以是任何数量,实际上超过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我希望除以我自己的功能。

2 个答案:

答案 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);

(这不需要对列表进行排序)