繁体   English   中英

使用 Linq 将对象列表分组为一个新的对象列表分组列表,每组中有 4 个对象

[英]Using Linq to group a list of objects into a new grouped list of list of objects with 4 objects in each group

我有一个包含 n 个元素的列表。 在我可以使用这些物品之前,我必须将它们分组,因此 1、2、3、4 进入一组,而 4、5、6、7 进入下一组...... n

我当前的 C# 代码是:

List<List<Job>> groupedJobs = AlotOfcSharpCode(unGroupedJobs);

A 有一种感觉,所有的东西都可以放在类似的东西上

var groupedJobs = unGroupedJobs.SelectMany().GroupBy().SomeOtherLinq

我的基本问题是遍历源列表并获取每 4 个元素,因此 1,2,3,4 进入一组,4,5,6,7 进入下一组使用 linq。

这是我的输入:

List<Job> JobList = new List<Job>();
JobList.Add( new Job { JobID = 1, } );
JobList.Add( new Job { JobID = 2, } );
JobList.Add( new Job { JobID = 3, } );
JobList.Add( new Job { JobID = 4, } );
JobList.Add( new Job { JobID = 5, } );
JobList.Add( new Job { JobID = 6, } );
JobList.Add( new Job { JobID = 7, } );
JobList.Add( new Job { JobID = 8, } );
JobList.Add( new Job { JobID = 9, } );
JobList.Add( new Job { JobID = 10, } );

我想要的结果是这样的结构

List<List<Job>> Groups = List<List<Job>>();

List<Job> group = new List<Job>();
JobList.Add( new Job { JobID = 1, } );
JobList.Add( new Job { JobID = 2, } );
JobList.Add( new Job { JobID = 3, } );
JobList.Add( new Job { JobID = 4, } );

group = new List<Job>();
JobList.Add( new Job { JobID = 5, } );
JobList.Add( new Job { JobID = 6, } );
JobList.Add( new Job { JobID = 7, } );
JobList.Add( new Job { JobID = 8, } );

group = new List<Job>();
JobList.Add( new Job { JobID = 9, } );
JobList.Add( new Job { JobID = 10, } );

这个分组的用法是我需要迭代每个组并做一些事情。

      List<Job> allJobs = stateStorage.Value.Jobs;

      var groupedJobs = GroupJobs(allJobs);
      
      foreach (var group in groupedJobs)
      {
          var doSomething = new DoSomething(group);
      }

      return something;
  }

  private static IEnumerable<IEnumerable<Job>> GroupJobs(IEnumerable<Job> allJobs)
  {
      var groupsIndex = new List<List<Job>>();

      var counter = 0;
      var group = new List<Job>();

      foreach (var job in allJobs)
      {
          if (counter == 4)
          {
              groupsIndex.Add(group);
              group = new List<Job>();
          }

          group.Add(job);

          counter++;
      }

      return groupsIndex;
  }

您可以使用以下组功能:

JobList.GroupBy(item => (item.JobID - 1) / 4)

组函数是整数除法 - 因此值 1 - 4 将接收组值 0,值 5 - 8 将接收组值 1,依此类推。 看起来这就是你要找的。

可能这会有所帮助。

来源:

public class Job
{
    public int JobID { get; set; }

    public static Job[] GetJobs()
    {
        var jobList = new[] {
        new Job { JobID = 1 },
        new Job { JobID = 2},
        new Job { JobID = 3},
        new Job { JobID = 4},
        new Job { JobID = 5},
        new Job { JobID = 6},
        new Job { JobID = 7},
        new Job { JobID = 8},
        new Job { JobID = 9},
        new Job { JobID = 10}
    };
    return jobList;
    }

    public override string ToString()
    {
        return $"Job {{ JobID={JobID} }}";            
    }
}

使用 Linq 进行分组查询:

       //Data Source
        var source = Job.GetJobs();
  
        //Query Creation
        var query = from index in Enumerable.Range(0, source.Length) 
                    group source[index] by index / 4;

        //Query Execution
        foreach (var item in query)
        {
            Console.WriteLine($"Group : {item.Key}");               
            item.ToList().ForEach(it => Console.WriteLine(it.ToString()));               
        }
       
        Console.ReadLine();

预期输出:

控制台输出图像

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM