加入 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"}
}
不确定这是否是您要查找的内容,但您可以使用 Select
和 SelectMany
创建 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的选择器。如果两者相同,将创建一个连接值。如果我们为两个选择器赋予相同的常量值,则始终满足连接条件,因此会创建所有可能的对。
连接的 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 });
}
}
是否可以加入 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"}
}
不确定这是否是您要查找的内容,但您可以使用 Select
和 SelectMany
创建 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的选择器。如果两者相同,将创建一个连接值。如果我们为两个选择器赋予相同的常量值,则始终满足连接条件,因此会创建所有可能的对。
连接的 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 });
}
}