C# 列表上循环的动态特性(C)

C# 列表上循环的动态特性(C),c#,for-loop,cartesian-product,C#,For Loop,Cartesian Product,我有3个列表,包含字符串 GenderList = ["M", "F"] AgeList = ["10-15", "16-20", "21-26"] CityList = ["CityA", "CityB"] 我想对列表进行交叉积,但danamically: 如果用户询问性别和城市: 我需要以下资料: foreach(var g in GenderList) foreach(var c in CityList ..... 如果用户询问性别\城市\年

我有3个列表,包含字符串

  GenderList = ["M", "F"] 
  AgeList    = ["10-15", "16-20", "21-26"]
  CityList   = ["CityA", "CityB"]
我想对列表进行交叉积,但danamically: 如果用户询问性别和城市: 我需要以下资料:

 foreach(var g in GenderList)
    foreach(var c in CityList
     .....
如果用户询问性别\城市\年龄,循环必须为:

foreach(var g in GenderList)
  foreach(var c in CityList)
    foreach(var a in AgeList)
       ....
如果用户询问城市年龄

我怎么做这个?我有大约20个列表,我需要动态地增加列表项
谢谢

让我们从广义笛卡尔开始:

结果:


让我们从广义笛卡尔开始:

结果:


你想做什么,concat字符串,构建一个具有所有属性的对象,…?我很好奇是否有比使用一堆for循环更好的方法。我不太确定您想要的是哪种数据,但这听起来像是Sql Server或某种RDBMS更适合您想要的数据,因为您可以使用条件左连接,从而获得您想要的数据。是的,我有来自数据库的3个表性别、城市、年龄,我将它们填入列表中。我想给用户一个关于城市性别、年龄性别、城市性别和年龄的计数,我的意思是,我想让用户填写一个包含动态列的excel表:性别城市coutn或性别城市年龄计数,或城市年龄计数…等等。在数据库表中,您的数据通过外键链接?不,单独的表,我想生成excel动态你想做什么,concat字符串,构建一个具有所有属性的对象,…?我很好奇是否有比使用一堆for循环更好的方法。我不太确定您想要的是哪种数据,但这听起来像是Sql Server或某种RDBMS更适合您想要的数据,因为您可以使用条件左连接,从而获得您想要的数据。是的,我有来自数据库的3个表性别、城市、年龄,我将它们填入列表中。我想给用户一个关于城市性别、年龄性别、城市性别和年龄的计数,我的意思是,我想让用户填写一个包含动态列的excel表:性别城市coutn或性别城市年龄计数,或城市年龄计数…等等。在数据库表中,您的数据通过外键链接?不,单独的表,我想生成excel动态,我会尝试,似乎很好的答案,非常感谢。我会尝试,似乎很好的答案,非常感谢
foreach(var c in CityList)
   foreach(var a in AgeList)
      ...
private static IEnumerable<T[]> Cartesian<T>(IEnumerable<IEnumerable<T>> source) {
  T[][] lists = source
    .Select(line => line.ToArray())
    .ToArray();

  if (source.Any(line => !line.Any()))
    yield break;

  int[] indexes = new int[lists.Length];

  do {
    yield return lists.Select((line, index) => line[indexes[index]]).ToArray();

    for (int i = 0; i < indexes.Length; ++i)
      if (++indexes[i] < lists[i].Length) 
        break;
      else
        indexes[i] = 0;
  }
  while (!indexes.All(index => index == 0));
}
// we allow to use any IEnumerable<string>, not necessary List<string>
Dictionary<string, IEnumerable<string>> data = 
  new Dictionary<string, IEnumerable<string>>(StringComparer.OrdinalIgnoreCase) {
    { "Gender", new [] { "M", "F" } },
    { "Age",    new List<string> { "10-15", "16-20", "21-26" } },
    { "City",   new [] { "CityA", "CityB" } },
};
 string userChoice = "gender_city_age";

 var result = Cartesian(userChoice.Split('_').Select(name => data[name]));

 // Have a look at the result:
 string report = string.Join(Environment.NewLine, result
   .Select(line => string.Join(", ", line)));

 Console.Write(report);
M, CityA, 10-15
F, CityA, 10-15
M, CityB, 10-15
F, CityB, 10-15
M, CityA, 16-20
F, CityA, 16-20
M, CityB, 16-20
F, CityB, 16-20
M, CityA, 21-26
F, CityA, 21-26
M, CityB, 21-26
F, CityB, 21-26