C# 花名册C中重复出现的字符有问题#

C# 花名册C中重复出现的字符有问题#,c#,C#,我已经列出了15个字符的名字,以及在我的球员名单中使用这些名字的球员。我需要从花名册中分配2支5人的球队,我很难理解如何在不出现反复出现的角色的情况下做到这一点 string playerName; List<string> nameLibrary = new List<string> {"Tim", "Smithy", "Bill", "Max", "Ryan", "Johnathon", "Brisbane", "Pearly Whites", "Old Mate",

我已经列出了15个字符的名字,以及在我的球员名单中使用这些名字的球员。我需要从花名册中分配2支5人的球队,我很难理解如何在不出现反复出现的角色的情况下做到这一点

string playerName;
List<string> nameLibrary = new List<string> {"Tim", "Smithy", "Bill", "Max", "Ryan", "Johnathon", "Brisbane", "Pearly Whites", "Old Mate", "Shanequia", "Davo", "Ben", "Big Shaq", "John Cena", "King Thing", "Doug"};

void Start ()
{
    playerName = name;
    List<Player> myListOfPlayers = new List<Player>();

    for (int x = 0; x < 15; x++)
    {
        int randName = Random.Range(0, nameLibrary.Count);
        name = nameLibrary[randName];
        nameLibrary.Remove(name);

        Player somePlayer = new Player();
        somePlayer.Setup(name);
        myListOfPlayers.Add(somePlayer);
    }

    List<Player> team1 = new List<Player>();
    for (int i = 0; i <= 5; i++)
    {
        Player Player1 = new Player();
        team1.Add(myListOfPlayers[Random.Range(0, 15)]);
        myListOfPlayers.Remove(Player1);
    }

    // Display team 1
    Debug.Log ("Team 1");
    foreach (Player Player1 in team1) 
    {
        Player1.PrintLine();
    }

    List<Player> team2 = new List<Player>();
    for (int i = 0; i <= 5; i++)
    {
        Player Player2 = new Player();
        team2.Add (myListOfPlayers [Random.Range (0, 15)]);
        myListOfPlayers.Remove (Player2);
    }

    // Display team 2
    Debug.Log ("Team 2");
    foreach (Player Player2 in team2) 
    {
        Player2.PrintLine();
    }
字符串播放器名称;
列表名称库=新列表{“Tim”、“Smithy”、“Bill”、“Max”、“Ryan”、“Johnathon”、“Brisbane”、“Pearly Whites”、“Old Mate”、“Shanequia”、“Davo”、“Ben”、“Big Shaq”、“John Cena”、“King Thing”、“Doug”};
无效开始()
{
playerName=名称;
List myListOfPlayers=new List();
对于(int x=0;x<15;x++)
{
int randName=Random.Range(0,nameLibrary.Count);
名称=名称库[randName];
名称库。删除(名称);
Player somePlayer=新玩家();
somePlayer.Setup(名称);
添加(somePlayer);
}
List team1=新列表();

对于(int i=0;i我将按照Sami的建议创建一个shuffle方法。从列表中删除将导致偏差(请参阅以获取解释)

创建一个shuffle方法(我没有写这个,但在其他项目中使用过):

公共静态列表洗牌(此IList列表)
{
随机rng=新随机();
int n=list.Count;
而(n>1)
{
n--;
int k=下一个(n+1);
T值=列表[k];
列表[k]=列表[n];
列表[n]=值;
}
返回(列表)列表;
}
大大简化您的代码:

var names = new List<string>();
/* add your names  */
names.Shuffle();

var team1 = names.Take(5);
var team2 = names.Skip(5).Take(5);
var name=newlist();
/*加上你的名字*/
names.Shuffle();
var team1=名称。取(5);
var team2=name.Skip(5)、Take(5);

当你选择一个玩家时,实际上是从列表中选择它。意思是删除它。或者洗牌列表,然后从列表中取第一个n。不要使用随机访问静态列表。你最好洗牌,从列表中选择和删除不是真正的随机,会造成偏差。我想补充一点
洗牌()
这里有一个扩展方法,这意味着它必须被放置在一个静态类中(例如,
公共静态类ShuffleHelper{…}
)。同样
返回列表;
应该可以工作,类型转换是不必要的。谢谢@Peter B,这也使用了Fisher-Yates算法。如果您感兴趣,这里有更多信息:
var names = new List<string>();
/* add your names  */
names.Shuffle();

var team1 = names.Take(5);
var team2 = names.Skip(5).Take(5);