繁体   English   中英

LINQ加入列表清单

[英]LINQ Join List of List

使用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();

我得到每个数据1的重复结果。

你没有在连接中使用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值而不是字符串中......

//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" });

您需要将on d1[0][0] equals d2[0][0] 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM