2013-04-03 74 views
2

我有兩個類如此。一個有另一個類的列表,並通過key1鏈接。加入兩個名單與一對多的關係

public class Alpha 
{ 
    public key1 { get; set; } 
    public List<Bravo> { //getter and setter } 
} 

public class Bravo 
{ 
    public key1 { get; set; } 
    public someProp { get; set; } 
} 

我有一個方法獲取兩個Alpha和Bravo列表,我需要將它們連接到一個Alpha列表中。每個阿爾法與布拉沃有一對多的關係,但現在我有很多阿爾法。我知道我可以遍歷這兩個列表,但有更快的方法嗎?

public List<Alpha> Join (List<Alpha> alphaList, List<Bravo> bravoList) 
{ 
    //match each Bravo with it's corresponding Alpha 
} 

例子:

alphaList = { 
    item1 { key1 = 1, bravoList { } } 
    item2 { key1 = 2, bravoList { } } 
    item3 { key1 = 3, bravoList { } } 
} 

bravoList = { 
    itemA { key1 = 1, someProp } 
    itemB { key1 = 2, someProp } 
    itemC { key1 = 2, someProp } 
    itemD { key1 = 3, someProp } 
    itemE { key1 = 3, someProp } 
} 

finalList = { 
    item1 { key1 = 1, bravoList { itemA } } 
    item2 { key1 = 2, bravoList { itemB, itemC } } 
    item3 { key1 = 3, bravoList { itemD, itemE } } 
} 
+2

對不起,你是不是清楚。你能提供一些例子嗎? – 2013-04-03 22:57:04

回答

2
public class Helper 
{ 
    public List<Alpha> Join(List<Alpha> alphaList, List<Bravo> bravoList) 
    { 
     return alphaList.Select(a => new Alpha() { key1 = a.key1, list = bravoList.Where(b => b.key1 == a.key1).ToList() }).ToList(); 
    } 
} 

public class Alpha 
{ 
    public int key1 { get; set; } 

    public List<Bravo> list { get; set; } 
} 

public class Bravo 
{ 
    public int key1 { get; set; } 

    public string someProp { get; set; } 
} 
+0

什麼是「list = bravoList.Where ...」中的「list」? – user1608132 2013-04-03 23:42:28

+0

這是你的財產「公開名單 {// getter and setter}」 – 2013-04-03 23:43:50

1

根據您的意見,的Bravo的上Alpha列表是非常多餘的,因爲它沒有被以任何方式的ORM管理。

如果你想加入,這裏是使用它最簡單的方法:

public IEnumerable<Tuple<Alpha, Bravo>> Join (IEnumerable<Alpha> alphaList, IEnumerable<Bravo> bravoList) 
{ 
    return (from a in alphaList 
      join b in bravoList on a.key1 equals b.key1 
      select Tuple.Create(a, b)) 
      .ToList(); 
} 

由於這是一個多到一的關係,這可能會更加有用:

public Lookup<Alpha, Bravo> Join (IEnumerable<Alpha> alphaList, IEnumerable<Bravo> bravoList) 
{ 
    return (from a in alphaList 
      join b in bravoList on a.key1 equal b.key1 into g 
      select new { a, g }) 
      .ToLookup(x => x.a, x.g) 
} 

注意into條款;它允許您將加入的項目組合在一起。然後我將這些分組變成Lookup,以方便訪問。

如果想保持Alpha名單,有可能是沒有辦法做到這一點沒有任何一個foreach -loop或大量工作建立自己的微型ORM的。

+0

所以Alpha對象中的Bravo列表是空的。我從數據庫中獲得Bravo的列表,並需要將它們加入到Alpha列表中。 – user1608132 2013-04-03 23:07:57

+0

@ user1608132是否爲此使用了ORM,例如實體框架,nhibernate等? – 2013-04-03 23:10:22

+0

不,只是mySql和c#。 – user1608132 2013-04-03 23:39:00

3

您可以使用Enumerable.Join

public List<Alpha> Join(List<Alpha> alphaList, List<Bravo> bravoList) 
{ 
    return alphaList.Join(bravoList, a => a.key1, b => b.key1, (a,b) => a) 
        .ToList(); 
} 

這將返回所有Alphaskey1也是在Bravos名單列表。

更新

public List<Alpha> Join(List<Alpha> alphaList, List<Bravo> bravoList) 
{ 
    List<Alpha> finalList = alphaList 
     .Select(a => new Alpha { 
      key1 = a.key1, 
      bravoList = bravoList.Where(b => b.key1 == a.key1).ToList() 
     }).ToList(); 
    return finalList; 
}