根据索引查找通用列表记录

时间:2013-01-22 10:16:47

标签: c# asp.net-mvc-3

我处于需要使用其位置从通用列表中找到记录的情况,意味着需要找到第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...);

希望我明白我的观点。

6 个答案:

答案 0 :(得分:1)

您可以使用LINQ SelectGroupBy执行类似的操作:

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]);
}