根据对象属性和阈值拆分对象集合

时间:2014-07-03 10:30:45

标签: c# vb.net linq

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

Class MenuSectionData
{
  string description
  List<string> links
 }  

以下列表包含MenuSectionData类中的对象数,每个对象都有特定数量的链接,例如2,3,4,1,2。另外,如果一个对象的链接数超过阈值,基本上我必须根据每个列表中的可用插槽截断额外的链接

  

私人menuSectionsDataList作为列表(Of   MenuSectionDate)= quickMenuDataHandler.GetData()

基本上输出应该是

List(Of List(Of MenuSectionData))

在某种程度上,上面列表中每个子列表的链接总数不应超过10,并且可以根据输入集合拥有最大数量的链接

非常感谢任何完成此任务的示例  无论是在vb还是C#中使用linq或其他

1 个答案:

答案 0 :(得分:0)

这应该适用于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