【问题标题】:C# merging two object listsC#合并两个对象列表
【发布时间】:2015-11-09 09:14:17
【问题描述】:

我有两个列表,我想合并到一个列表中。 Active Directory 中的计算机列表和 SCCM 中的计算机列表。

ListA 包含:

    public string ComputerName { get; set; }
    public string OperatingSystem { get; set; }
    public DateTime? LastLogon { get; set; }

ListB 包含:

    public string ComputerName { get; set; }
    public DateTime[] AgentTime { get; set; }
    public string LastLogonUserName { get; set; }

我想通过 ComputerName 进行合并,但如果我使用(示例)进行连接:

    var query = from ObjectA in ListA
          join ObjectB in ListB on ObjectA.ComputerName equals ObjectB.ComputerName
          select new { computername = ObjectA.ComputerName, lastlogonusername = ObjectB.LastLogonUserName };

它只显示两个列表的结果。我想列出 AD 中的计算机,并为那些也在 SCCM 中的计算机提供附加信息

ListC 包含:

    public string ComputerName { get; set; }
    public string OperatingSystem { get; set; }
    public DateTime? LastLogon { get; set; }
    public DateTime[] AgentTime { get; set; }
    public string LastLogonUserName { get; set; }

最好的方法是什么?

【问题讨论】:

  • 你得到的输出是你内部连接的结果。
  • 在以下网页上查看左外连接:code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
  • 您正在通过new {} 创建一个动态对象。如果需要,创建一个自定义类。
  • 正如@AmitKumarGhosh 所说,这是一个内部连接。做一个左连接,你会得到你想要的信息。有很多左连接 LINQ 示例
  • 你能举个例子来说明你想要的输出吗?我不明白。通过 cmets,我可以理解您想要左连接?是这样吗?这意味着您将获得 A 中的所有项目,如果它在 B 中也有一对,它将被配对。否则,它将与 null/默认值配对。

标签: c# linq object


【解决方案1】:

你需要一个外连接:

var query =
      from ObjectA in ListA
      join ObjectB in ListB on ObjectA.ComputerName equals ObjectB.ComputerName into tmp
      from ObjectB in tmp.DefaultIfEmpty()
      select new { computername = ObjectA.ComputerName, lastlogonusername = ObjectB?.LastLogonUserName };

注意?.ObjectB上的使用:这是因为如果ListB中没有匹配项,ObjectB将为空。

(如果你不使用 C#6,你可以改用ObjectB != null ? ObjectB.LastLogonUserName : null

【讨论】:

  • 感谢托马斯的快速回答。从上面的 cmets 中,我用左外连接弄清楚了。但感谢用 ? 指点我。不匹配过程而不是 ObjectB == null ? “”:ObjectB.LastLogonUserName。谢谢
【解决方案2】:

为什么不将所有内容添加到一个列表中,然后简单地通过 ComputerName 获取一个不同的列表?

// Convert all B objects to A objects
var objectBsAsAs = ListB.Select(x => new ObjectA() { ComputerName = x.ComputerName, LastLogonUserName = x.LastLogonUserName });
// Add all B objects to the list of A objects
var allComputers = ListA.AddRange(objectBsAsAs);
// Get a distinct list based on ComputerName
var distinct = ListA.Distint(new ComputerNameComparer());

private class ComputerNameComparer : IEqualityComparer<ObjectA> 
{
    public bool Equals(ObjectA a, ObjectA b) 
    {
        return a.ComputerName == b.ComputerName;
    }
}

【讨论】:

  • 不客气。您可以通过给答案投票来表示感谢! :)
【解决方案3】:

这样的事情可能会有所帮助 -

        var l1 = new List<A>
        {
            new A
            {
                ComputerName = Dns.GetHostName(),
                LastLogon = DateTime.Now,
                OperatingSystem = "Windows"
            }
        };

        var l2 = new List<B>
        {
            new B
            {
                AgentTime = new DateTime[]{DateTime.Now},
                ComputerName = Dns.GetHostName(),
                LastLogonUserName = "me"
             }
        };


        var o = from r in l2
                join q in l1 on r.ComputerName equals q.ComputerName
                into grp
                from p in grp.DefaultIfEmpty()
                select new C
                {
                    AgentTime = r.AgentTime,
                    ComputerName = p.ComputerName,
                    LastLogon = p.LastLogon,
                    OperatingSystem = p.OperatingSystem,
                    LastLogonUserName = r.LastLogonUserName
                };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2018-04-21
    • 2021-09-04
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多