2013-02-21 43 views
3

我试图在ID列上加入两个列表(flist和slist)。列表定义,类定义,列表内容和所需结果显示如下。在指定的列上加入两个列表

List<first> flist= new List<first>(); 
List<second> slist= new List<second>(); 


public class first 
{ 
    public string name { get; set; } 
    public int ID{ get; set; } 
    public string itemAttr { get; set; } 
} 
public class second 
{ 
    public int ID{ get; set; } 
    public string itemAttr{ get; set; } 
} 

列出内容

flist: 
apples | 1 
bananas| 2 
trees | 3 

slist: 
1  | fruit 
3  | not-fruit 

期望的结果:

flist: 
apples | 1  | fruit 
bananas | 2  | 
trees | 3  | not-fruit 
+0

看看linq的'join',[这里是参考资料](http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx) – Candide 2013-02-21 16:18:27

+1

感谢您指点我正确的方向,Candide! – 2013-02-21 16:19:33

回答

9
List<first> flist= new List<first>(); 
List<second> slist= new List<second>(); 

var result = from f in flist 
      join s in slist on f.ID equals s.ID into g 
      select new { 
       f.name, 
       f.ID, 
       itemAttr = g.Any() ? g.First().itemAttr : null 
      }; 
+2

这是完美的。对于任何有相同问题的人,可以用foreach访问结果(结果中的var v)。 – 2013-02-21 16:57:17

0

您可以使用 “左外” 连接使用LINQ:

var joined = from l1 in flist 
      join l2 in slist on l1.ID equals l2.ID into gj 
      from l2_sub in gj.DefaultIfEmpty() 
      select new { 
       name = l1.name, 
       ID = l1.ID, 
       itemAttr = l2_sub == null ? String.Empty : l2_sub.itemAttr 
      }; 
0
namespace WindowsFormsApplication26 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 


     private void Form1_Load(object sender, EventArgs e) 
     { 
      List<first> flist = new List<first>(); 
      List<second> slist = new List<second>(); 

      flist.Add(new first("apples", 1)); 
      flist.Add(new first("bananas", 2)); 
      flist.Add(new first("trees", 3)); 

      slist.Add(new second(1, "Fruit")); 
      slist.Add(new second(2, "")); 
      slist.Add(new second(3, "Not-Fruit")); 

      var result = (from t in flist 
          join x in slist 
          on t.ID equals x.ID 

          select new 
          { 
           Name = t.name, 
           Id = t.ID, 
           attrib = x.itemAttr 

          }).ToList(); 
     } 


     public class first 
     { 
      public first() 
      { 

      } 

      public first(string n, int id) 
      { 
       name = n; 
       ID = id; 
      } 

      public string name { get; set; } 
      public int ID { get; set; } 

     } 

     public class second 
     { 
      public second() 
      { 

      } 

      public second(int id, string itm) 
      { 
       ID = id; 
       itemAttr = itm; 
      } 

      public int ID { get; set; } 
      public string itemAttr { get; set; } 
     } 
    } 
} 
2

试试这个

foreach(var f in first) 
{ 
    foreach(var s in second) 
    { 
     if(f.ID == s.ID) 
     { 
      f.fAttr = item.itemAtrr; 
     } 
    } 
} 
0

什么问题?用参数创建一个新的类:ID,name,itemAttr。用这个类创建新的列表,并将需要的位置写入需要的数据。