如何使用LINQ或Lambda表达式连接两个列表

72

我有两个列表,List<WorkOrder>List<PlannedWork>。我想按照下面详细说明的工作订单号将这两个列表合并。换句话说,我有一份计划工作清单,但我需要知道工作订单号对应的工作描述。

我对linq和lambda表达式都很新,并且还没有完全理解它们。

class WorkOrder
{
    public int WorkOrderNumber { get; set; }
    public string WorkDescription { get; set; }
}

class PlannedWork
{
    public int WorkOrderNumber { get; set; }
    public DateTime ScheduledDate { get; set; }
}
3个回答

124

使用扩展方法而不是LINQ查询语法来实现这一点的方法如下:

var results = workOrders.Join(plans,
  wo => wo.WorkOrderNumber,
  p => p.WorkOrderNumber,
  (order,plan) => new {order.WorkOrderNumber, order.WorkDescription, plan.ScheduledDate}
);

13
+1 对于 Linq 扩展方法。我发现在使用 C# 进行阅读和编写时,这个版本更加流畅。 - Dylan Hogg
2
如果表格使用两个属性(列)进行连接会怎样? - Peter Isaac
哇,你为我节省了好几个月的时间。谢谢你! - Amos Chihi
2
@Peter Isaac 你可以使用类似 wo => new { wo.Id1, wo.Id2 } 的方式。 - Emy Blacksmith

110

听起来你想要的是:

var query = from order in workOrders
            join plan in plans
                 on order.WorkOrderNumber equals plan.WorkOrderNumber
            select new
            {
                order.WorkOrderNumber,
                order.Description,
                plan.ScheduledDate
            };

28
Jon Skeet...我刚刚发布了这个问题,您已经回答了!请问有何窍门? - Brad

6
 public class State
        {
            public int SID { get; set; }
            public string SName { get; set; }
            public string SCode { get; set; }
            public string SAbbrevation { get; set; }
        }

        public class Country
        {
            public int CID { get; set; }
            public string CName { get; set; }
            public string CAbbrevation { get; set; }
        }


 List<State> states = new List<State>()
            {
               new  State{  SID=1,SName="Telangana",SCode="+91",SAbbrevation="TG"},
               new  State{  SID=2,SName="Texas",SCode="512",SAbbrevation="TS"},
            };

            List<Country> coutries = new List<Country>()
            {
               new Country{CID=1,CName="India",CAbbrevation="IND"},
               new Country{CID=2,CName="US of America",CAbbrevation="USA"},
            };

            var res = coutries.Join(states, a => a.CID, b => b.SID, (a, b) => new {a.CName,b.SName}).ToList();

2
请对这段代码进行一些解释(正确缩进也很好),并说明它为什么能够回答该问题。 - trincot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接