加入 2 个列表并创建一对多关系

join 2 lists and create one to many relationship

是否可以加入 2 个列表并创建一对多关系?

例如,

list 1:
{"High", "Med", "Low"}

list 2:
{"Submitted", "In Progress", "Draft", "Rejected"}

最终列表,我将有这样的值:

{
{"High", "Submitted"}, {"High", "In Progress"},{"High", "Draft"}, {"High", "Rejected"},
{"Med", "Submitted"}, {"Med", "In Progress"},{"Med", "Draft"}, {"Med", "Rejected"},
{"Low", "Submitted"}, {"Low", "In Progress"},{"Low", "Draft"}, {"Low", "Rejected"}
}

不确定这是否是您要查找的内容,但您可以使用 SelectSelectMany 创建 KeyVaulePair.

的最终列表
        var list1 = new List<string>() { "High", "Medium", "Low" };
        var list2 = new List<string>() { "Submitted", "In-Progress", "Draft", "Rejected" };
        
        var joined = list1.SelectMany(val1 => list2.Select(val2 => new KeyValuePair<string, string>(val1, val2)));
        foreach(var res in joined) 
        {
            Console.WriteLine(res.Key + "," + res.Value);
        }

如果您想使用命令式编码风格,只需创建 2 个 for 循环

看来,您正在寻找 Cartesian Join,您可以借助 Linq:

  var list1 = new List<string>() { 
    "High", "Medium", "Low" };

  var list2 = new List<string>() { 
    "Submitted", "In-Progress", "Draft", "Rejected" };
  
  // I've combined values as named tuple: (string first, string second)
  // but you can use anonymous class, or just concat string strings 
  var joined = list1
    .SelectMany(item1 => list2.Select(item2 => (first: item1, second: item2)));
    .ToList();

一起来看看:

  Console.Write(string.Join(Environment.NewLine, joined));

结果:

(High, Submitted)
(High, In-Progress)
(High, Draft)
(High, Rejected)
(Medium, Submitted)
(Medium, In-Progress)
(Medium, Draft)
(Medium, Rejected)
(Low, Submitted)
(Low, In-Progress)
(Low, Draft)
(Low, Rejected)

您可以使用 LINQ 中的连接方法:

List<(string,string)> joined = list1.Join(list2, x => true, y => true, (x,y) => (x,y)).ToList();

第二个和第三个参数是list1和list2的选择器。如果两者相同,将创建一个连接值。如果我们为两个选择器赋予相同的常量值,则始终满足连接条件,因此会创建所有可能的对。

在线演示:https://dotnetfiddle.net/JaK6ff

连接的 LINQ 方法语法非常难看,甚至违反直觉,恕我直言;查询语法看起来很多 nicer/easier 阅读:

from s in list1
from t in list2
select new { s, t }

或作为元组:

from s in list1
from t in list2
select ( s, t )
            

如果你想做笛卡尔积并想将它存储在 text-value 对中,那么你可以将 List 与 SelectListItem 一起使用。它会给你 text-value 对的列表。

var list1 = new List<string>() { "High", "Medium", "Low" };
var list2 = new List<string>() { "Submitted", "In-Progress", "Draft", "Rejected" };
List<SelectListItem> list3 = new List<SelectListItem>();
   foreach (string str in list1)
   {
      foreach(string str2 in list2)
      {
         list3.Add(new SelectListItem()
         { Text = str, Value = str2 });
      }
   }