2014-07-07 88 views
3

我有兩個IEnumerable<T>(與不同的T)的實例。我想結合他們兩個。Concat兩個不同類型的枚舉

  1. IEnumerable<ClassA>

  2. IEnumerable<ClassB>

無論是在A級和ClassB我有一個共同的特性.Lets說,例如,它是EMPID ..

有一個構建在.Net中的方法來做到這一點,還是我必須自己寫?

+7

在這裏定義「結合」;你想要連接由公共屬性定義的序列嗎?一個工會?交點?一個「內部連接」?單邊外連接?一個完整的外連接?什麼?你有一個示例輸入和輸出? –

回答

1

您不能在一個序列中組合兩個不同類型的序列,除非您將它們的某些屬性投射到一個通用類型中並創建此類型的序列。

例如,讓我們有以下兩個類:

public class A 
{ 
    public int ID { get; set; } 
    public string FirstName { get; set; } 
    public int Age { get; set; } 
} 

public class B 
{ 
    public int ID { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
    public bool Sex { get; set; } 
} 

而且,讓你有兩個序列,classA類型的一個包含對象和其他含對象類型爲classB。然後,如果你聲明第三種類型叫做classCommon,將包含classAclassB的commont性質,

public class classCommon 
{ 
    public int ID { get; set; } 
    public int Age { get; set; } 
} 

,你可以嘗試以下方法:

var result = listA.Select(x => new classCommon { ID = x.ID, Age = x.Age }) 
        .Concat(listB.Select(x => new classCommon{ ID = x.ID, Age = x.Age }); 
+1

或者你也可以創建一個基本引用列表,比如'IEnumerable ',在這種情況下你可以合併這些枚舉類型,所以說「你不行」有點讓人誤解。 –

+0

@AdamHouldsworth感謝您的優點! – Christos

+0

您好AdamHouldsworth, 感謝您的答覆。請您幫我解決以下問題。 public class A { public int CID {get;組; } public string FirstName {get;組; } public int Age {get;組; } } public class B { public int CID {get;組; } public intSNum {get;組; } } public commom M public int CID {get;組; } public string FirstName {get;組; } public int Age {get;組; } public int SNum {get;組; } } Ienumerable = A和B與所有值的組合 這裏一個CID可以包含多個SNUM。 – user3543884

2

假設你可以在共​​同財產中提取到一個通用的接口,比方說IEmployee,那麼你可以只是Cast(),然後Concatenate收藏:

​​

請注意,這隻會根據需要迭代那些IEnumerable。如果你想創建一個包含List在你將它們結合在一起時兩個序列的內容,你可以使用ToList()

List<IEmployee> all = classAItems.Cast<IEmployee>().Concat(classBItems).ToList(); 

你可以做同樣的,如果你只需要使用ToArray()數組。

2

你可以得到串聯共同財產很輕鬆地:

var empIds = first.Select(x => x.EmpId).Concat(second.Select(x => x.EmpId)); 

如果這不是你是什麼後,你將有更加具體。

1

可以相對於最低的共同標準,這是object在你例子中是concat他們:

IEnumerable<ClassA> e1 = new List<ClassA>(); 
IEnumerable<ClassB> e2 = new List<ClassB>(); 

IEnumerable<object> c = e1.Cast<object>() 
          .Concat(e2.Cast<object>()); 

但是,這不會給你太多,你將不得不運行時對象類型的檢查中c集合。

您可以創建一個更好的共同點,比如它具有性能EmpId,由雙方ClassAClassB實施了一些界面IClass

如果你不關心智能感知,你可以嘗試使用dynamic

IEnumerable<ClassA> e1 = new List<ClassA>() { new ClassA() { A = 1 } }; 
IEnumerable<ClassB> e2 = new List<ClassB>(); 

IEnumerable<dynamic> c = e1.Cast<object>() 
          .Concat(e2.Cast<object>()); 
int a = c.First().A; 

在上面的代碼中,a將正確導致1