C# LINQ方法将集合分组为具有指定元素数的子组

C# LINQ方法将集合分组为具有指定元素数的子组,c#,linq,.net-3.5,group-by,C#,Linq,.net 3.5,Group By,是否存在LINQ方法将给定集合分组为具有指定数量元素的子组?我的意思是,类似于Scala的grouped方法。 e、 g.在Scala中,List(89,67,34,11,34)。分组(2)给出List(List(89,67),List(34,11),List(34)) 如果这样的方法不存在,那么LINQ的方法是什么呢?您可以尝试本文中所示的方法 公共静态类分组扩展 { 公共静态IEnumerable分组( 这是一个可数输入, 整数组计数) { 如果(input==null)抛出新的Argume

是否存在LINQ方法将给定集合分组为具有指定数量元素的子组?我的意思是,类似于Scala的
grouped
方法。
e、 g.在Scala中,
List(89,67,34,11,34)。分组(2)
给出
List(List(89,67),List(34,11),List(34))


如果这样的方法不存在,那么LINQ的方法是什么呢?

您可以尝试本文中所示的方法

公共静态类分组扩展
{
公共静态IEnumerable分组(
这是一个可数输入,
整数组计数)
{
如果(input==null)抛出新的ArgumentException(“input”);
如果(groupCount<1)抛出新的ArgumentException(“groupCount”);
IEnumerator e=input.GetEnumerator();
while(true)
{
列表l=新列表();
对于(int n=0;n
这样使用:

List<int> l = new List<int>{89, 67, 34, 11, 34};
foreach (IEnumerable<int> group in l.Grouped(2)) {
    string s = string.Join(", ", group.Select(x => x.ToString()).ToArray());
    Console.WriteLine(s);
}
List l=新列表{89,67,34,11,34};
foreach(l.Grouped(2)中的IEnumerable群){
字符串s=string.Join(“,”,group.Select(x=>x.ToString()).ToArray());
控制台。写入线(s);
}
结果:

89, 67 34, 11 34 89, 67 34, 11 34
以下是一个网站,它似乎有一些示例代码来实现您想要的功能:

因此,您可以使用这个方法并创建一个扩展方法

扩展方法示例:

static class ListExtension
{
    public static List<List<T>> BreakIntoChunks<T>(this List<T> list, int chunkSize)
    {
        if (chunkSize <= 0)
        {
            throw new ArgumentException("chunkSize must be greater than 0.");
        }

        List<List<T>> retVal = new List<List<T>>();

        while (list.Count > 0)
        {
            int count = list.Count > chunkSize ? chunkSize : list.Count;
            retVal.Add(list.GetRange(0, count));
            list.RemoveRange(0, count);
        }

        return retVal;
    }
}
静态类ListExtension
{
公共静态列表细分块(此列表,int chunkSize)
{
如果(块大小0)
{
int count=list.count>chunkSize?chunkSize:list.count;
retVal.Add(list.GetRange(0,count));
列表。删除范围(0,计数);
}
返回返回;
}
}

是的,你可以。但是你可以争论它是否很漂亮

  Int64[] aValues = new Int64[] { 1, 2, 3, 4, 5, 6 };
  var result = aValues
          .Select( ( x, y ) => new KeyValuePair<Int64, Int32>( x, y ) )
          .GroupBy( x => x.Value / 2 )
          .Select( x => x.Select( y => y.Key ).ToList() ).ToList();
Int64[]aValues=newint64[]{1,2,3,4,5,6};
var结果=有效值
.选择((x,y)=>新的KeyValuePair(x,y))
.GroupBy(x=>x.Value/2)
.Select(x=>x.Select(y=>y.Key).ToList()).ToList();
工作原理:

从原始集合中选择xy,其中x是实际值,y是给定集合中的索引。然后对索引和所需分组长度进行整数除法分组(在本例中为2

按整数除法分组将向上取整到较低的-so0/2=01/2=0等,这将为我们提供所需的分组类别值。这就是我们在这里分组反对的


对于结果,只选择列表中分组的值,并将其作为列表集合返回。

顺便说一句,请为方法使用不同的名称。tuple这个词在C#/LINQ/FP的上下文中已经有了意义。你有什么好的建议吗<代码>分组
?还有别的吗?我没有编写代码,但我认为您可以更改方法的名称,而不影响它的工作方式。它似乎没有递归地调用自己或者类似的东西。这不是问题所在。命名一个与元组无关的方法
Tupled
,只会让其他人感到困惑<代码>分组或
GroupInto
在我看来很好。请对您的答案进行投票。太糟糕了,我不能把多个答案标为正确答案。谢谢。:)如果你将代码内联到原始源代码的链接,我会很高兴。有了上面答案中的代码,你不能从任何列表中直接调用breakintockunk(size)。您只需要包含放置扩展方法的名称空间。错误。。。注释并不是发布代码的正确位置。我建议把它添加到你的答案中去。对你的答案投了赞成票。太糟糕了,我不能把多个答案标为正确答案。谢谢。:)美丽的!现在你能简单地解释一下它是如何工作的吗?你看,我对林克不是很精通。当然。如果这个解释有帮助,请告诉我,如果没有帮助,我会尽量想出一个更好的解释。不,这就足够了。我喜欢这个把戏。非常感谢您的精彩回答。:)可能重复的
  Int64[] aValues = new Int64[] { 1, 2, 3, 4, 5, 6 };
  var result = aValues
          .Select( ( x, y ) => new KeyValuePair<Int64, Int32>( x, y ) )
          .GroupBy( x => x.Value / 2 )
          .Select( x => x.Select( y => y.Key ).ToList() ).ToList();