LINQ:将单个列表分成多个列表

Dav*_*vid 3 c# linq

我有一个包含这些条目的数组:

{1, 1, 2, 2, 3,3,3, 4}
Run Code Online (Sandbox Code Playgroud)

我想将它们转换为(在这种情况下为3个列表):

{1,2,3,4}
{1,2,3}
{3}
Run Code Online (Sandbox Code Playgroud)

有没有办法用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,3,4,5}将是{1,2,3,4,5} {1,2,3} {2,3}

Ser*_*kiy 10

private IEnumerable<List<int>> FooSplit(IEnumerable<int> items)
{
    List<int> source = new List<int>(items);
    while (source.Any())
    {
        var result = source.Distinct().ToList();
        yield return result;
        result.ForEach(item => source.Remove(item));
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

int[] items =  { 1, 1, 2, 2, 3, 3, 3, 4 };

foreach(var subList in FooSplit(items))
{
    // here you have your three sublists
}
Run Code Online (Sandbox Code Playgroud)

这是另一种解决方案,它的可读性较差,但性能更佳:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很优雅的解决方案 一个人必须喜欢stackoverflow.大家好! (2认同)