我处于需要使用其位置从通用列表中找到记录的情况,意味着需要找到第5和第9记录,然后是第2和第6记录等等......
情况是
分配给团队列表的项目列表, 所以如果我们有20个项目和4个团队
然后第一个项目进入第一个团队,第二个进入第二个团队,第三个进入第三个团队,第四个进入第四个团队 然后第五个项目再次进入第一队所以就像
Projects Team
1 1
2 2
3 3
4 4
5 1
6 2
7 3
8 4
9 1
.
.
所以现在我想在通用列表上运行查询来获取每个团队的记录,因此对于第一个团队记录1,5和9 ....需要获取。
有点像
List<Project> lst = list (from Database)
//For 1stTeam
lst = lst.Index(1,5,9...);
//For 2nsTeam
lst = lst.Index(2,6,10...);
希望我明白我的观点。
答案 0 :(得分:1)
您可以使用LINQ Select
和GroupBy
执行类似的操作:
List<int> list = new List<int>{1,2,3,4,5,6,7,8,9,10};
int numberOfTeams = 4;
var projectsByTeam = list
.Select((number, index) => new {Value = number, Index = index})
.GroupBy(item => item.Index % numberOfTeams)
.Select(item => new {TeamNumber = item.Key+1, ProjectIDs = item.Select(x => x.Value).ToList()})
.ToList();
将原始列表拆分为
{
{TeamNumber = 1, ProjectIDs = {1,5,9}},
{TeamNumber = 2, ProjectIDs = {2,6,10}},
{TeamNumber = 3, ProjectIDs = {3,7}},
{TeamNumber = 4, ProjectIDs = {4,8}},
}
答案 1 :(得分:0)
首先,这不是通用列表所特有的。
您必须创建一个新列表,然后逐个添加原始列表中新列表中所需的项目。您可以通过索引器(方括号)访问给定位置的单个项目。
List<Project> lst = // list (from Database)
List<Project> firstTeam = new List<Project>();
firstTeam.Add(lst[1]);
firstTeam.Add(lst[5]);
firstTeam.Add(lst[9]);
List<Project> secondTeam = new List<Project>();
secondTeam.Add(lst[2]);
secondTeam.Add(lst[6]);
secondTeam.Add(lst[10]);
当然,如果在原始lst
内定期分发商品,您可以自动确定商品:
List<Project> firstTeam = new List<Project>();
for (int i = 1; i < lst.Count; i += 4) {
firstTeam.Add(lst[i]);
}
即。你循环遍历原始列表,每4个项目。
如果要添加到其中一个团队的项目不在lst
中定期分发,则必须逐个添加,但您可以使用较短的列表初始化语法:
List<Project> firstTeam = new List<Project>() { lst[1], lst[5], lst[9] };
最后,请注意List<T>
开始将索引计为零,因此第一项是lst[0]
,而不是lst[1]
。
答案 2 :(得分:0)
您正在寻找params关键字。它允许您传入Index
一个参数数组,这些参数就是您的情况下的索引。
在你的情况下,扩展方法可以解决这个问题:
public static List<Project> Index(this List<Project> list, params int[] indexes)
{
var newList = new List<Project>();
foreach(var index in indexes)
{
newList.Add(list[index]);
}
return newList;
}
答案 3 :(得分:0)
您可以使用:
List<Project> projects; // = something from db
var neededIndexes = new[] { 0, 4, 8 };
var result = projects.Where((project, index) => neededIndexes.Contains(index)).ToList();
或者如果索引均匀分布:
List<Project> projects; // = something from db
var result = projects.Where((project, index) => index % 4 == 0).ToList();
答案 4 :(得分:0)
// Define other methods and classes here
static IEnumerable<IEnumerable<T>> CustomSplit<T>(this IEnumerable<T> source, int max)
{
var results = new List<List<T>>();
for (int i = 0; i < max; i++)
{
results.Add(new List<T>());
}
int index = 0;
using (var enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
int circularIndex = index % max;
results[circularIndex].Add(enumerator.Current);
index++;
}
}
return results;
}
以下是如何使用它:
void Main()
{
var elements = Enumerable.Range(0, 100).CustomSplit(4);
}
答案 5 :(得分:0)
这可以解决您的问题:
每个团队的名单:
List<List<Project>> projectsPerTeam = new List<List<Project>> ();
for(int i=0;i<teamsList.Count();i++)
{
projectsPerTeam.Add(new List<Project> ());
}
现在您的问题(为正确的团队添加项目):
for(int i=0;i<projectsList.Count();i++)
{
projectsPerTeam[i%teamList.Count()].Add(projectsList[i]);
}