2016-07-26 6 views
0

私はチームと呼ばれるオブジェクトのリストを持っていますが、それらのグループを作成したいのですが、ランダムではありません。グループ番号は機能とリストに与えられますCのオブジェクトのリストからグループを作成する

public List<List<Team>> GenerateGroups(List<Team> teams, int amount) 
{ 
    List<List<Team>> result = new List<List<Team>>(); 
    for (int i = 0; i < amount; ++i) 
     result.Add(new List<Team>()); 
    foreach(Team team in teams) 
    { 
     //Add something   
    } 
    return result; 
} 

私はここにこだわっています。私はどのようにチームを追加するか分からない。また、誰かが自分のコードを凝縮することができれば、かなり役に立ちます。誰かが良いアイデアを持っているなら、List>を返す必要はありません。

class Group { 
    List<Team> teams; 
} 

やチームの追加について:

+0

は、グループが同じサイズである必要がありますか? –

+0

'staticランダムrnd = newランダム(); var randomObjectIndex = rnd.Next(list.Count); var FinallList .Add(list [randomObjectIndex]) リストからランダムなオブジェクトを取得する方法 – MKasprzyk

+0

@KevinLeeいいえチームと量の変数に余分なリストを追加する必要があるためです。私は今のところそれを仕事にしようとします。 –

答えて

1

この1つは重複せずに、ランダムなグループを与える:

private static Random _rnd = new Random(); 

private static Team GetAndRemoveRandomTeam(List<Team> allTeams) 
{ 
    int randomIndex = _rnd.Next(allTeams.Count); 
    Team randomTeam = allTeams[randomIndex]; 
    allTeams.RemoveAt(randomIndex); 
    return randomTeam; 
} 

public static List<List<Team>> GenerateGroups(List<Team> teams, int amount) 
{ 
    int teamCount = (int) teams.Count/amount; 
    List<Team> allteams = teams.ToList(); // copy to be able to remove items 

    if (teamCount == 0) 
     return new List<List<Team>> {allteams}; 

    List<List<Team>> allTeamGroups = new List<List<Team>>(); 
    List<Team> thisTeam = new List<Team>(); 
    while (allteams.Count > 0) 
    { 
     if (thisTeam.Count == amount) 
     { 
      allTeamGroups.Add(thisTeam); 
      thisTeam = new List<Team>(); 
     } 
     thisTeam.Add(GetAndRemoveRandomTeam(allteams)); 
    } 
    allTeamGroups.Add(thisTeam); 

    return allTeamGroups; 
} 
+0

私の例では重複が発生する理由を説明できますか?ありがとう:) –

+0

@GiladGreen:私はあなたの答えをコメントしていないが、f.e. [this](http://stackoverflow.com/a/38589813/284240)回答は重複しています。 –

+0

ああ申し訳ありません:)私はそれを逃して実際にダブを持っていたと思った –

1

私はあなたのようなGroupクラスを定義することがより良いことだと思う

Random rnd = new Random(); 
List<Group> groups = new List<Group>(); 
     for (int i = 0; i < amount; ++i) 
      groups.Add(new Group()); 

     foreach(Team team in teams) 
     { 
      int index = rnd.Next(0, amount); 
      groups[index].Add(team); 
     } 
     return groups; 
+0

それは私が後でやることです。今のところ、コメントがある括弧内のコードを探しています –

6

これはあなたのteamsランダムにして、グループに入れて注文します。リストで出力グループの数はamountパラメータに応じている。

public static List<List<Team>> GenerateGroups(List<Team> teams, int amount) 
{ 
    return teams.OrderBy(item => Guid.NewGuid()) 
      .Select((item, index) => new { Item = item, GroupIndex = index % amount }) 
      .GroupBy(item => item.GroupIndex, 
        (key, group) => group.Select(groupItem => groupItem.Item).ToList()) 
      .ToList(); 
} 

一つは、ランダムRandomクラスを使用することができますが、私はそれを順序を作成するためにそれを使用していないgroup byでしょう。このように:

public static List<List<Team>> GenerateGroups(List<Team> teams, int amount) 
{ 
    Random random = new Random(); 
    return teams.OrderBy(item => random.NextDouble()) 
      .Select((item, index) => new { Item = item, GroupIndex = index % amount }) 
      .GroupBy(item => item.GroupIndex, 
        (key, group) => group.Select(groupItem => groupItem.Item).ToList()) 
      .ToList(); 
} 
+0

@Tonio - 私の編集を参照してください。 「ランダム」は私に同じ数字を2回与えるかもしれないのでグループ分けにはしません - それでグループ化すれば、不均一なサイズのグループが得られます –

+0

私はあなたの解が良いと凝縮していると思います。私のコードでテストしてみましょう –

+1

'NextDouble()'を 'Next(teams.Count)'にすると、より良いランダム化が得られます。また、より効率的であると確信しています。 – MikeT

関連する問題