C# 如何从随机匹配的字符串中排除不需要的匹配

C# 如何从随机匹配的字符串中排除不需要的匹配,c#,arrays,C#,Arrays,例如,我有这样一个代码 string[] person = new string[] { "Son", "Father", "Grandpa" }; string[] age = new string[] { "Young", "In his 40-s", "Old" }; string[] unwanted = new string { "Old Son", "Young GrandPa" }; Random X = new Random(); string Who = person[i.

例如,我有这样一个代码

string[] person = new string[] { "Son", "Father", "Grandpa" };
string[] age = new string[] { "Young", "In his 40-s", "Old" };

string[] unwanted = new string { "Old Son", "Young GrandPa" };

Random X = new Random();
string Who = person[i.Next(0, person.Length)];
string HowOld = age[i.Next(0, age.Length)];
Console.WriteLine("{0} {1}", Who, HowOld);
我希望获得所有随机匹配,但从数组“多余”中排除两个变体。(当然这只是一个例子,可能会有更多的数组和可能的错误匹配)


做这件事的好方法是什么?关键的一点是,无论如何,我想保持获得所有结果的可能性。因此,我想在生成后可以选择排除内容,但不要使生成“old son”变得不可能。首先,定义一个包含数组中两个值的类:

class PersonWithAge
{
    public string Person { get; set; }
    public string Age { get; set; }
}
接下来,使用LINQ生成所有可能的人员和年龄组合:

// Create cross product
var results = (from x in person
               from y in age
               select new PersonWithAge{Person=x, Age=y}).ToList();
现在(如果需要)删除例外情况:

results.RemoveAll(n => n.Person == "Son" && n.Age == "Old"
                    || n.Person == "Grandpa" && n.Age == "Young");

如果您想阻止某些组合,我相信您可能会有无法匹配在一起的对/组的“规则”,例如
string[][]阻塞
int[][]阻塞
,如果访问
blocked[I][j]
I
是当前单词,数组
blocked[I]
是无法匹配的单词(或单词本身)的索引(所有这些都假设您可能有多个单词可能不想与当前单词匹配,如果只有一个单词,一个简单的数组就足够了),那么您只需确保您使用的随机值不是“禁止”值之一。希望这能有所帮助

为什么不在通过随机索引查询之前过滤掉所有不需要的数据呢?
如果(谁==“爷爷”霍华德==“年轻”){/*选择不同的值*/}
听起来就像你真正想做的是将你的年龄数组分成年轻/老年,并针对每个人类型存储一个年轻/老年标识符,无论如何,我想有一个选项来获得所有结果。但要有一个方法,该方法将在生成某些匹配项后删除这些匹配项。所以我有两个选择-一个完全混乱,一个-混乱,但预定义的例外。