C# 基于对象属性和阈值拆分对象集合

C# 基于对象属性和阈值拆分对象集合,c#,vb.net,linq,C#,Vb.net,Linq,我需要根据对象属性之一将对象列表拆分为n个列表 在这种情况下,属性可以是一个链接列表。它的拆分方式应确保每个输出列表中元素的链接总数不超过某个阈值,例如10 我的对象类如下 Class MenuSectionData { string description List<string> links } 在某种程度上,上述列表的每个子列表的链接总数不应超过10个,并且可以根据输入集合拥有最大数量的链接 任何能完成这项任务的样品都将受到高度赞赏 无论是在vb或C中,使用li

我需要根据对象属性之一将对象列表拆分为n个列表 在这种情况下,属性可以是一个链接列表。它的拆分方式应确保每个输出列表中元素的链接总数不超过某个阈值,例如10
我的对象类如下

Class MenuSectionData
{
  string description
  List<string> links
 }  
在某种程度上,上述列表的每个子列表的链接总数不应超过10个,并且可以根据输入集合拥有最大数量的链接

任何能完成这项任务的样品都将受到高度赞赏
无论是在vb或C中,使用linq或其他

这都应该适用于Linqpad

在下面的代码中,我们指定每个部分最多需要10个链接,并且在部分列表中最多需要12个链接

void Main()
{
    var firstMenuSection = new MenuSectionData{
        Description = "First",
        Links = new List<string> {"link 1", "link 2", "link 3", "link 4","link 5", "link 6","link 7", "link 8","link 9", "link 10","link 11", "link 12"}};

    var secondMenuSection = new MenuSectionData{
        Description = "Second",
        Links = new List<string> {"link 1", "link 2", "link 3", "link 4","link 5"}};

    var initialMenu = new List<MenuSectionData>{
        firstMenuSection, secondMenuSection
    };

    var menu = CreateConstrainedMenu(initialMenu, 12, 10);

    menu.Dump();
}

public List<MenuSectionData> CreateConstrainedMenu(List<MenuSectionData> initialMenu, int maxNumberOfLinks, int maxNumberOfLinksPerSection){

    int remainingLinks = maxNumberOfLinks;
    foreach(var section in initialMenu){ 
        var availableLinks = section.Links.Take(Math.Min(remainingLinks,maxNumberOfLinksPerSection)).ToList();  
        section.Links = availableLinks;
        remainingLinks -=  availableLinks.Count();
    }

    return initialMenu;
}

public class MenuSectionData
{
  public  string Description {get;set;}
  public List<string> Links {get;set;}
 }  

// Define other methods and classes here
void Main()
{
var firstMenuSection=新建MenuSectionData{
Description=“First”,
链接=新列表{“链接1”、“链接2”、“链接3”、“链接4”、“链接5”、“链接6”、“链接7”、“链接8”、“链接9”、“链接10”、“链接11”、“链接12”};
var secondMenuSection=新的MenuSectionData{
Description=“Second”,
链接=新列表{“链接1”、“链接2”、“链接3”、“链接4”、“链接5”};
var initialMenu=新列表{
第一个菜单操作,第二个菜单操作
};
变量菜单=CreateConstrainedMenu(initialMenu,12,10);
menu.Dump();
}
公共列表CreateConstrainedMenu(列表初始菜单、int-maxNumberOfLinks、int-maxNumberOfLinksPerSection){
int remainingLinks=maxNumberOfLinks;
foreach(initialMenu中的var节){
var availableLinks=section.Links.Take(Math.Min(remainingLinks,maxNumberOfLinksPerSection)).ToList();
节链接=可用链接;
remainingLinks-=availableLinks.Count();
}
返回初始菜单;
}
公共类menuseConctionData
{
公共字符串说明{get;set;}
公共列表链接{get;set;}
}  
//在此处定义其他方法和类

谢谢你的回答我没有足够的声誉去投票支持它
void Main()
{
    var firstMenuSection = new MenuSectionData{
        Description = "First",
        Links = new List<string> {"link 1", "link 2", "link 3", "link 4","link 5", "link 6","link 7", "link 8","link 9", "link 10","link 11", "link 12"}};

    var secondMenuSection = new MenuSectionData{
        Description = "Second",
        Links = new List<string> {"link 1", "link 2", "link 3", "link 4","link 5"}};

    var initialMenu = new List<MenuSectionData>{
        firstMenuSection, secondMenuSection
    };

    var menu = CreateConstrainedMenu(initialMenu, 12, 10);

    menu.Dump();
}

public List<MenuSectionData> CreateConstrainedMenu(List<MenuSectionData> initialMenu, int maxNumberOfLinks, int maxNumberOfLinksPerSection){

    int remainingLinks = maxNumberOfLinks;
    foreach(var section in initialMenu){ 
        var availableLinks = section.Links.Take(Math.Min(remainingLinks,maxNumberOfLinksPerSection)).ToList();  
        section.Links = availableLinks;
        remainingLinks -=  availableLinks.Count();
    }

    return initialMenu;
}

public class MenuSectionData
{
  public  string Description {get;set;}
  public List<string> Links {get;set;}
 }  

// Define other methods and classes here