2014-07-07 57 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