2013-04-02 45 views
1

我有2名泛型列表List<type1> L1List<type2> L2在C#V4合併2名的2種不同類型(替代)名單

我的問題:TYPE1有一個名爲「鍵1」和type2的屬性有一個名爲「KEY2」的屬性,我想要將L1和L2合併到key1 = key2上的唯一列表中。

我需要合併這些動態的方式,因爲我不知道這兩個類的屬性,我只知道每種類型的第一個屬性是主鍵。

+2

你是什麼意思的'第一屬性'? –

+0

我有2所列出: 列表1 列表2 每個類有很多屬性,所以第一屬性是每一個對象在列表中的主鍵 –

回答

0
var foo = (from type1 in list1 
      join type2 in list2 on type1.Id equals type2.Id 
      select new {type1, type2}).ToList(); 
+0

謝謝您的回答,但是,怎麼樣,如果我不知道名字每班的第一個屬性? –

0

通過說'屬性',我假設你引用的是屬性或字段。 請不要使用「屬性」,因爲這是混亂,意味着完全不同的東西:

[Attribute] 
class type1 
{ 
    public int Field; 

    public int Property { get; set; } 
} 

所以,你必須Type1和Type2,並希望基於第一字段或屬性加入他們在一個列表類。如果你知道的屬性名稱,最簡單的實現是使用動態(假設PROP1和PROP2屬性名):

var foo = 
(from type1 in list1 
join type2 in list2 on ((dynamic)type1).Prop1 equals ((dynamic)type2).Prop2 
select new {type1, type2}).ToList(); 

由於這是不是這樣的,我們要選擇「第一」字段或屬性類,我們唯一的方法是使用反射。如果你知道你有你的類(或唯一字段)唯一屬性 - 您可以使用簡單的實現:

var t1 = typeof(type1); 
var t2 = typeof(type2); 

//replace with .GetFields() if neccessary 
var p1 = t1.GetProperties()[0]; // find first declared property of type1 
var p2 = t2.GetProperties()[0]; // find first declared property of type2 

var foo = (from obj1 in list1 
     join obj2 in list2 on p1.GetValue(obj1,null) equals p2.GetValue(obj2,null) 
     select new {obj1, obj2}).ToList(); 

如果字段和屬性類中的相互混合,你可以列出使用FindMembers所有成員(MemberTypes .Field | MemberTypes.Property ...),但是這種方法有一個問題 - 字段總是被重新定位到類的開始,儘管字段順序似乎被保留下來,在下面的情況下F1總是作爲第一個成員返回類(GetFields()將返回F1,F2和GetProperties - P1,this []):

class A 
{ 
    public int P1 { get;set;} 
    public int F1; 
    public int this[int x] { get{return x;} set {} } 
    public int F2; 
} 

此外,此方法還存在其他問題:

  • 如果您的第一個屬性是索引器,該怎麼辦? (在上面的例子中int [..])
  • 如果第一個字段/屬性返回的對象沒有爲Equals實現重載,該怎麼辦?
  • 如果你的第一個屬性沒有實現getter(罕見,但可能)呢?等

而且,一般來說,這種設計(當你不知道字段/屬性名稱,並依賴於他們在一個類中的相對位置)被認爲是不好的。引用MSDN: ... GetMembers方法不按特定順序返回成員,例如按字母順序或聲明順序。您的代碼不得依賴於成員返回的順序,因爲順序會有所不同。

相關問題