1

私は、その位置を使用して一般的なリストからレコードを検索する必要がある状況にあります。つまり、1番目の5番目と9番目のレコード、次に2番目の6番目と10番目のレコードなどを検索する必要があります。

状況は

チームのリストに割り当てられたプロジェクトのリストしたがって、20のプロジェクトと4つのチームがある場合

次に、1番目のプロジェクトが1番目のチームに移動し、2番目が2番目のチームに移動し、3番目が3番目のチームに移動し、4番目が4番目のチームに移動し、次に5番目のプロジェクトが1番目のチームに移動します

だからそのような

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

SelectLINQとを使用して、次のようなことができます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

まず、これは汎用リストに固有のものではありません。


新しいリストを作成してから、元のリストから新しいリストに必要なアイテムを1つずつ追加する必要があります。インデクサー(角かっこ)を使用して、特定の位置にある単一のアイテムにアクセスできます。

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つおきのアイテムを取得します。


チームの1つに追加するアイテムが定期的に全体に配布されていないlst場合は、それらを1つずつ追加する必要がありますが、短いリスト初期化構文を使用できる場合があります。

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

これはあなたの問題を解決します:

各チームのリスト:

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 に答える
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 に答える