加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – LINQ:将单个列表分成多个列表

发布时间:2020-12-16 00:06:37 所属栏目:百科 来源:网络整理
导读:我有一个包含这些条目的数组: {1,1,2,3,4} 我想将它们转换为(在这种情况下为3个列表): {1,4}{1,3}{3} 有没有办法用LINQ或SQL做到这一点?我想这个操作有一个数学术语,不幸的是我不知道…… 或者我必须使用循环吗? ======= 编辑:我无法真正描述逻辑,所以
我有一个包含这些条目的数组:

{1,1,2,3,4}

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

{1,4}
{1,3}
{3}

有没有办法用LINQ或SQL做到这一点?我想这个操作有一个数学术语,不幸的是我不知道……

或者我必须使用循环吗?

=======

编辑:我无法真正描述逻辑,所以这里有更多的例子..它或多或少在数组上循环多次并且每个数字一次(但每一个数字只有一次),直到没有数字为止

{1,4,5}
将会
{1,5}
{1,3}
{3}

要么

{1,3}
{2,3}

解决方法

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));
    }
}

用法:

int[] items =  { 1,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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读