C# LINQ:将单个列表分离为多个列表

C# LINQ:将单个列表分离为多个列表,c#,linq,C#,Linq,我有一个包含以下条目的数组: {1, 1, 2, 2, 3,3,3, 4} 我想将它们转换为(本例中为3个列表): 有没有办法用LINQ或SQL实现这一点?我猜这个运算有一个数学术语,不幸的是我不知道 还是我必须用循环来做 ======= 编辑:我不能真正描述逻辑,所以这里有更多的例子。。它或多或少地在数组上循环多次,并对每个数字执行一次(但每轮仅对每个数字执行一次),直到没有剩余的数字为止 {1,1,2,2,3,3,3,4,5} 会是 {1,2,3,4,5} {1,2,3} {3} 或 {1

我有一个包含以下条目的数组:

{1, 1, 2, 2, 3,3,3, 4}
我想将它们转换为(本例中为3个列表):

有没有办法用LINQ或SQL实现这一点?我猜这个运算有一个数学术语,不幸的是我不知道

还是我必须用循环来做

=======

编辑:我不能真正描述逻辑,所以这里有更多的例子。。它或多或少地在数组上循环多次,并对每个数字执行一次(但每轮仅对每个数字执行一次),直到没有剩余的数字为止

{1,1,2,2,3,3,3,4,5} 会是 {1,2,3,4,5} {1,2,3} {3}

{1,1,2,2,2,3,3,4,5} 会是 {1,2,3,4,5} {1,2,3} {2,3}

这就是工作:

    static void Main(string[] args)
    {
        int[] numbers = {1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5};
        List<int> nums = new List<int>(numbers.Length);
        nums.AddRange(numbers);

        while (nums.Count > 0)
        {
            int[] n = nums.Distinct().ToArray();
            for (int i = 0; i < n.Count(); i++)
            {
                Console.Write("{0}\t", n[i]);
                nums.Remove(n[i]);
            }
            Console.WriteLine();
        }

        Console.Read();
    }
static void Main(字符串[]args)
{
int[]数字={1,1,2,2,3,3,3,3,4,5};
List nums=新列表(编号.长度);
nums.AddRange(数字);
而(nums.Count>0)
{
int[]n=nums.Distinct().ToArray();
对于(int i=0;i

下面是另一个解决方案,可读性较差,但性能更好:

private IEnumerable<IEnumerable<int>> FooSplit(IEnumerable<int> items)
{
    var groups = items.GroupBy(i => i).Select(g => g.ToList()).ToList();    

    while (groups.Count > 0)
    {
       yield return groups.Select( g => 
             { var i = g[0]; g.RemoveAt(g.Count - 1); return i; });
       groups.RemoveAll(g => g.Count == 0);
    }
}
private IEnumerable foopsplit(IEnumerable项)
{
var groups=items.GroupBy(i=>i).Select(g=>g.ToList()).ToList();
而(groups.Count>0)
{
收益率回报组。选择(g=>
{vari=g[0];g.RemoveAt(g.Count-1);返回i;};
groups.RemoveAll(g=>g.Count==0);
}
}

这里有一个可选的控制台应用程序:

class Program
{
    class Freq
    {
        public int Num { get; set; }
        public int Count { get; set; }
    }

    static void Main(string[] args)
    {
        var nums = new[] { 1, 1, 2, 2, 3, 3, 3, 4 };
        var groups = nums.GroupBy(i => i).Select(g => new Freq { Num = g.Key, Count = g.Count() }).ToList();
        while (groups.Any(g => g.Count > 0))
        {
            var list = groups.Where(g => g.Count > 0).Select(g => g.Num).ToList();
            list.ForEach(li => groups.First(g => g.Num == li).Count--);
            Console.WriteLine(String.Join(",", list));
        }

        Console.ReadKey();
    }

}

分离的逻辑是什么?如果ur数组={1,2,2,3,3,3,4,5}?{1,2,3,4,5},{2,3},{3},{3}?非常优雅的解决方案。一个人必须爱他。谢谢大家!很好,但从性能角度来看不是最佳的-O(N*N)complexity@SergeyS同意,您通常必须在简单性和性能之间进行选择。添加了另一个解决方案,它不会在每次迭代中创建不同的集合
int[] items =  { 1, 1, 2, 2, 3, 3, 3, 4 };

foreach(var subList in FooSplit(items))
{
    // here you have your three sublists
}
private IEnumerable<IEnumerable<int>> FooSplit(IEnumerable<int> items)
{
    var groups = items.GroupBy(i => i).Select(g => g.ToList()).ToList();    

    while (groups.Count > 0)
    {
       yield return groups.Select( g => 
             { var i = g[0]; g.RemoveAt(g.Count - 1); return i; });
       groups.RemoveAll(g => g.Count == 0);
    }
}
class Program
{
    class Freq
    {
        public int Num { get; set; }
        public int Count { get; set; }
    }

    static void Main(string[] args)
    {
        var nums = new[] { 1, 1, 2, 2, 3, 3, 3, 4 };
        var groups = nums.GroupBy(i => i).Select(g => new Freq { Num = g.Key, Count = g.Count() }).ToList();
        while (groups.Any(g => g.Count > 0))
        {
            var list = groups.Where(g => g.Count > 0).Select(g => g.Num).ToList();
            list.ForEach(li => groups.First(g => g.Num == li).Count--);
            Console.WriteLine(String.Join(",", list));
        }

        Console.ReadKey();
    }

}