从列表生成所有随机maches,但有一些例外

时间:2015-07-04 17:48:31

标签: c# list random match

假设我有五个这样的列表

  List<string> A = new List<string> {"A1", "A2", "A3", "A4", "A5"};
  List<string> B = new List<string> {"B1", "B2", "B3", "B4", "B5"};
  List<string> C = new List<string> {"C1", "C2", "C3", "C4", "C5"};
  List<string> D = new List<string> {"D1", "D2", "D3", "D4", "D5"};
  List<string> E = new List<string> {"E1", "E2", "E3", "E4", "E5"};

我希望从其元素中随机生成所有可能的对,例如“A1 E2”,“D4 A2”(A1 E2和E2 A1是不同的匹配)等。 BUT因此,列表B和C中的元素永远不会匹配。

所以我只是尝试做这样的事情

  Random X = new Random();
  int rand = X.Next(1, 10); // actual range depends on number of lists

  if (rand == 1)
  Console.WriteLine(A[X.Next(A.Count)] + B[X.Next(B.Count)]) // AB match
  else if (rand == 2)
  Console.WriteLine(A[X.Next(A.Count)] + C[X.Next(C.Count)]) // AC match
  else if (rand == 3)
  Console.WriteLine(A[X.Next(A.Count)] + A[X.Next(A.Count)]) // AA match

等等。不包括BC比赛。如果我有一些列表,它可以正常工作。但是如果列表数量增加,则此代码会变得太长而且笨拙。 即使有4个列表,我还需要14种组合来描述!(16减去BC和CB)。所以我的问题是 - 如何让它更短更有效?

问题2 - 如果我不仅要生成对,还要生成三元组怎么办?比如“A1 B3 E5”。有例外(B和C)或没有。

1 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是为第一个项目创建所有列表的列表。然后,如果第一个项目是B,则从列表中删除C并随机化第二个项目。

以下是一些示例代码:

List<List<string>> group = new List<List<string>> { A, B, C, D, E };
Random rnd = new Random();
List<string> firstList = group[rnd.Next(group.Count)];

if (firstList == B) group.Remove(C);
else if (firstList == C) group.Remove(B);

List<string> secondList = group[rnd.Next(group.Count)];

Console.WriteLine(firstList[rnd.Next(firstList.Count)] + secondList[rnd.Next(secondList.Count)]);

关于第二个问题:您可以使用循环概括第一个解决方案并将项目存储在结果列表中:

List<List<string>> group = new List<List<string>> { A, B, C, D, E };
Random rnd = new Random();
int count = 3; //for triplets
List<string> result = new List<string>(count);
for (int i = 0; i < count; i++)
{
   List<string> row = group[rnd.Next(group.Count)];

   if (row == B) group.Remove(C);
   else if (row == C) group.Remove(B);

   result.Add(row[rnd.Next(row.Count)]);
}
foreach (string item in result)
{
     Console.Write(item);
}
Console.WriteLine();