1

我处于需要使用其位置从通用列表中查找记录的情况,意味着需要找到第 1 条第 5 条和第 9 条记录,然后是第 2 条第 6 条和第 10 条记录,依此类推...

情况是

分配给团队列表的项目列表,所以如果我们有 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...);

希望我能澄清我的观点。

4

6 回答 6

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}}, 
}
于 2013-01-22T10:28:15.850 回答
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]

于 2013-01-22T10:19:10.357 回答
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;
}
于 2013-01-22T10:21:44.977 回答
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();
于 2013-01-22T10:21:45.667 回答
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);
}
于 2013-01-22T10:25:33.510 回答
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]);
}
于 2013-01-22T10:27:23.793 回答