【问题标题】:LINQ - Combine multiple lists to form a new list and align them by key?LINQ - 组合多个列表以形成一个新列表并按键对齐?
【发布时间】:2011-03-25 18:51:43
【问题描述】:

我有两个不同列的列表,但每个列表都有一个具有相同键的公共列,我如何将它们组合成一个新列表,即:

public class TradeBalanceBreak
{
    public int CommID { get; set; }
    public int CPFirmID { get; set; }
    public double CreditDfferenceNotional { get; set; }
    public string Currency { get; set; }
}

public class Commission
{
    public int CommID { get; set; }
    public PeriodStart { get; set; }
    public ResearchCredit { get; set; }
}

public class CommissionList
{
    public List<Commission> Commissions { get { return GetCommissions(); }}

    private List<Commission> GetCommissions()
    {
        // retrieve data code ... ...
    }
}

public class TradeBalanceBreakModel
{
    public List<TradeBalanceBreak> TradeBalanceBreaks { get; set; }
}

public class CommissionModel
{
    public List<CommissionList> CommissionLists { get; set; }
}

我想要实现的是将TradeBalancesBreaksCommissionLists(来自模型类)合并/展平为一个。 CommID 在两者之间共享。

谢谢。

【问题讨论】:

    标签: linq list linq-to-objects


    【解决方案1】:

    使用 Join(扩展方法版本)- 更新后

     var list1 = GetTradeBalanceBreaks();
     var list2 = new CommisionsList().Commissions;
    
     var combined = list1.Join( list2,  l1 => l1.ID, l2 => l2.First().ID,
                                (l1,l2) = > new
                                            {
                                               l1.CommID, 
                                               l1.CPFirmID,
                                               l1.CreditDifferenceNotional,
                                               l1.Currency,
                                               PeriodStarts= l2.SelectMany( l => l.PeriodStart ),
                                               ResearchCredits = l2.SelectMany( l => l.ResearchCredit ) 
                                           })
                         .ToList();
    

    【讨论】:

    • 我刚刚更新了我原来的问题,因为List 2 实际上是一个列表列表,有点复杂。请你看一下好吗?谢谢。
    • @Saxman - 你可以接近,但不完全是你想要的。问题是每个地址/传真对的数量不确定,但选择必须具有相同的参数集。如果您愿意将地址列表和传真号码列表作为财产,它会起作用。查看我的更新。
    • 我在尝试更新代码时遇到此错误,基本上是在您显示 Addresses = l2.SelectMany... 的位置。首先,我需要再深入一点,我不能只做l2.SelectMany(...),我需要做类似l2.Addresses.SelectMany(....) 的事情,那么这是返回的错误:The type arguments for method 'System.Linq.Enumerable.SelectMany&lt;TSource,TResult&gt;(System.Collections.Generic.IEnumerable&lt;TSource&gt;, System.Func&lt;TSource,int,System.Collections.Generic.IEnumerable&lt;TResult&gt;&gt;)' cannot be inferred from the usage. Try specifying the type arguments explicitly. 感谢查看。
    • @Saxman -- 现在回家了,但如果您可以更新您的列表的确切类型,那将会有所帮助。在这里给我留言,我会根据你的新信息看看我能做些什么。
    • @tvanfosson - 我已经用我正在使用的模型/类更新了我的原始问题。你会看看吗?非常感谢。
    【解决方案2】:
    var combined = from p in PhoneNumbers
                   join a in Addresses on a.ID equals p.ID
                   select new {
                       ID = p.ID,
                       Name = p.Name,
                       Phone = p.Phone,
                       Address = a.Address,
                       Fax = a.Fax
                   };
    

    【讨论】:

    • 我刚刚更新了我原来的问题,因为List 2 实际上是一个列表列表,有点复杂。请你看一下好吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多