使用LINQ,我如何加入(内部联接)列表数据列表
示例数据:
List<List<string>> datas1 = new List<List<string>>();
datas1.add(new List() { "1", "Item 1" });
datas1.add(new List() { "2", "Item 2" });
datas1.add(new List() { "3", "Item 3" });
List<List<string>> datas2 = new List<List<string>>();
datas1.add(new List() { "1", "20" });
datas1.add(new List() { "2", "10" });
List<List<string>>
中的预期结果:
List("1", "Item 1", "20");
List("2", "Item 2", "10");
我试试
var result = datas1
.Join(datas2, d1 => datas1[0], d2 => datas2[0], (d1, d2) => { d1 })
.ToList();
我得到空结果,然后尝试:
var result = datas1
.Join(datas2, d1 => datas1[0][0], d2 => datas2[0][0], (d1, d2) => { d1 })
.ToList();
我得到每个数据的重复结果。
答案 0 :(得分:3)
您没有在联接中使用lambda表达式中的参数 - 您使用了datas1[0]
和datas2[0]
而不是d1[0]
和d2[0]
。此外,您对结果的投射不会让您想要您想要的。
您的查询应该是这样的:
var result = datas1
.Join(datas2, d1 => d1[0], d2 => d2[0],
(d1, d2) => new List<string> { d1[0], d1[1], d2[1] })
.ToList();
或者您可以使用查询表达式:
var result = (from d1 in datas1
join d2 in datas2 on d1[0] equals d2[0]
select new List<string> { d1[0], d1[1], d2[1] })
.ToList();
(我个人认为,在这种情况下我会坚持使用非查询表达式版本。)
但是,最好不要使用List<List<string>>
,而是为所有数据使用适当的类型 - 可能使用匿名类型作为结果。例如,您可能会有类似的内容:
var result = datas1
.Join(datas2, d1 => d1.Id, d2 => d2.Id,
(d1, d2) => new { d1.Id, d1.Name, d2.Description })
.ToList();
然后,您还可以将数字存储在int
值中,而不是存储在字符串中......
答案 1 :(得分:1)
//Sample data
List<List<string>> datas1 = new List<List<string>>();
datas1.Add(new List<string>() { "1", "Item 1" });
datas1.Add(new List<string>() { "2", "Item 2" });
datas1.Add(new List<string>() { "3", "Item 3" });
List<List<string>> datas2 = new List<List<string>>();
datas2.Add(new List<string>() { "1", "20" });
datas2.Add(new List<string>() { "2", "10" });
您需要加入datas1
和 datas2
on d1[0][0] equals d2[0][0]
,如下所示:
//Query
var result = (from d1 in datas1
join d2 in datas2 on d1[0][0] equals d2[0][0]
select new List<string> { d1[0], d1[1], d2[1] })
.ToList();