[英]Using Linq to group a list of objects into a new grouped list of list of objects with 4 objects in each group
I have a List with n elements.我有一个包含 n 个元素的列表。 Before I can use the items I must group them so 1,2,3,4 goes into one group and 4,5,6,7 goes into the next group ... n
在我可以使用这些物品之前,我必须将它们分组,因此 1、2、3、4 进入一组,而 4、5、6、7 进入下一组...... n
my current c# code is:我当前的 C# 代码是:
List<List<Job>> groupedJobs = AlotOfcSharpCode(unGroupedJobs);
A have the feeling that all that can be placed with something like A 有一种感觉,所有的东西都可以放在类似的东西上
var groupedJobs = unGroupedJobs.SelectMany().GroupBy().SomeOtherLinq
My basic problem is to iterate over the source list and take every 4 element so 1,2,3,4 goes into one group and 4,5,6,7 goes into the next group using linq.我的基本问题是遍历源列表并获取每 4 个元素,因此 1,2,3,4 进入一组,4,5,6,7 进入下一组使用 linq。
This is my input:这是我的输入:
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, } );
My desired outcome is a structure like我想要的结果是这样的结构
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, } );
The usage of this grouping is that I need to iterate each group and do stuff.这个分组的用法是我需要迭代每个组并做一些事情。
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;
}
You can use the following group function:您可以使用以下组功能:
JobList.GroupBy(item => (item.JobID - 1) / 4)
Group function is integer division - so values 1 - 4 will receive group value 0, values 5 - 8 will have group value 1 and so on.组函数是整数除法 - 因此值 1 - 4 将接收组值 0,值 5 - 8 将接收组值 1,依此类推。 Looks like this is what you are looking for.
看起来这就是你要找的。
May be this could Help.可能这会有所帮助。
Source:来源:
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} }}";
}
}
Group Query Using Linq:使用 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();
Expected Ouput:预期输出:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.