我有2名泛型列表List<type1> L1
,List<type2> L2
在C#V4合併2名的2種不同類型(替代)名單
我的問題:TYPE1有一個名爲「鍵1」和type2的屬性有一個名爲「KEY2」的屬性,我想要將L1和L2合併到key1 = key2上的唯一列表中。
我需要合併這些動態的方式,因爲我不知道這兩個類的屬性,我只知道每種類型的第一個屬性是主鍵。
我有2名泛型列表List<type1> L1
,List<type2> L2
在C#V4合併2名的2種不同類型(替代)名單
我的問題:TYPE1有一個名爲「鍵1」和type2的屬性有一個名爲「KEY2」的屬性,我想要將L1和L2合併到key1 = key2上的唯一列表中。
我需要合併這些動態的方式,因爲我不知道這兩個類的屬性,我只知道每種類型的第一個屬性是主鍵。
var foo = (from type1 in list1
join type2 in list2 on type1.Id equals type2.Id
select new {type1, type2}).ToList();
謝謝您的回答,但是,怎麼樣,如果我不知道名字每班的第一個屬性? –
通過說'屬性',我假設你引用的是屬性或字段。 請不要使用「屬性」,因爲這是混亂,意味着完全不同的東西:
[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;
}
此外,此方法還存在其他問題:
而且,一般來說,這種設計(當你不知道字段/屬性名稱,並依賴於他們在一個類中的相對位置)被認爲是不好的。引用MSDN: ... GetMembers方法不按特定順序返回成員,例如按字母順序或聲明順序。您的代碼不得依賴於成員返回的順序,因爲順序會有所不同。
你是什麼意思的'第一屬性'? –
我有2所列出: 列表1 列表2 每個類有很多屬性,所以第一屬性是每一個對象在列表中的主鍵 –