【问题标题】:joining two sets in LINQ在 LINQ 中加入两组
【发布时间】:2010-05-19 16:41:09
【问题描述】:
    var setsA = new List<SetA> {
        new SetA { SsnA = "3450734507", name = "setA"},
        new SetA { SsnA = "6833467788", name = "setA"},
        new SetA { SsnA = "5452347787", name = "setA"},
        new SetA { SsnA = "9345345345", name = "setA"},
    };

    var setsB = new List<SetB> {
        new SetB { SsnB = "5452347787" ,name = "setB"},
        new SetB { SsnB = "9345345345", name = "setB"},
    };

当我使用这个 linq 时:

var Set =
                from seta in setsA
                join setb in setsB
                 on seta.SsnA
                    equals setb.SsnB
                select new { 
                    SSN = seta.SsnA,
                    NAME = setb.name
                };

我得到这个值:

{ SSN = "5452347787", NAME = "setB" }
{ SSN = "9345345345", NAME = "setB" }

但我希望拥有结合这两者的 SET,结果将是:

{ SSN = "3450734507", NAME = "setA" }
{ SSN = "6833467788", NAME = "setA" }
{ SSN = "5452347787", NAME = "setB" }
{ SSN = "9345345345", NAME = "setB" }

这将是一个结果集,它会用名称 NAME 属性告诉我它来自哪个集,如果在 SetA 和 SetB 中找到 SSN,它将具有属性 NAME = "setB"

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 顺便说一句 - 我希望这些不是真正的 SSN 号码...
  • @Sunny 这些是未来需要 10 位数字的 SSN。

标签: c# linq join set


【解决方案1】:

您似乎想要一个外部连接 - 这是使用 GroupJoin 完成的:

var set = setsA.GroupJoin(
    setsB,
    sa => sa.SsnA,
    sb => sb.SsnB,
    (a, bs) => new { SSN = a.SsnA, NAME = bs.Any() ? "setB" : "setA" });

【讨论】:

    【解决方案2】:

    这里描述的 LINQ 方式: http://msdn.microsoft.com/en-us/library/bb397895.aspx 看起来像这样(功能与 lambda 方式相同):

     var set = from a in setsA
               join b in setsB on a.SsnA equals b.SsnB into g
               from o in g.DefaultIfEmpty()
               select new { SSN = a.SsnA, NAME = (o != null ? o.name : a.name)};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 2021-07-23
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多