将列表按N分组到新标签[]

时间:2014-04-29 11:54:30

标签: c# linq grouping

嗨,我是linq和c#的新手。

我需要按N对客户端对象列表进行分组,并将其替换为tab。 例如 清单: USER1 用户2 (......) 用户N

我希望收到List<Client>[] tabOfClients里面较小的列表,如:

  

tab [0] - user1到userN的列表

     

tab [1] - userN + 1到用户2N的列表

     

(...)

N = 3

我找到了将每个第三个对象分组的方法,但它不是我的目标 有人帮帮我吗?

4 个答案:

答案 0 :(得分:2)

一些条带和分组:

var groupedUsers = users.Select((e,i) => new{ Index=Math.Floor(i/n),User=e})
                    .GroupBy(g => g.Index);

实例:http://rextester.com/GZORR50968

解释:

users是您要分组的对象列表  users.Select((e,i) => new{ Index=Math.Floor(i/n),User=e})项目列出了具有2个属性的匿名对象列表:

  • Index是将项目的索引除以组中所需的项目数的结果
  • User是原始对象

此时,您最终会得到一个列表,例如

  • Index = 0,User = a
  • Index = 0,User = b
  • Index = 0,User = c
  • Index = 1,User = d
  • Index = 1,User = e
  • Index = 1,User = f

然后您可以GroupBy Index获取列表清单。

答案 1 :(得分:0)

为N的每个倍数执行循环并在循环内为每个选项卡[x]创建一个新列表,并使用适当的用户填充列表。

答案 2 :(得分:0)

这是使用Dictionary<int,List<string>>

的解决方案
   List<string> list = new List<string>{"1","2","3","4","5","6","7"};

   var dict = new Dictionary<int, List<string>>();

   for (int i = 0; i < list.Count; i+=3)
       dict[i] = list.Where((s,index) => index >= i && index < i+3).ToList();

答案 3 :(得分:-1)

我不知道为什么你想通过linq这样做,但它是可行的:

static void Main(string[] args)
{
    var o = Enumerable.Range(0, 100).Select(x => x.ToString());
    int i = 0;
    var groups = o.GroupBy(x => i++ / 3);
    foreach (var g in groups)
    {
        Console.WriteLine(String.Join(",", g));
    }
}

我们正在使用i来计算某些内容被击中和分组的次数。

请注意,这可能不适用于所有LINQ源,但对于简单的集合,它可以正常工作。

我建议您简单地使用该方法。