Concat两个不同类型的Ienumebles

时间:2014-07-07 09:18:39

标签: c#

我有两个IEnumerable<T>个实例(不同的T)。我想把它们两者结合起来。

  1. IEnumerable<ClassA>

  2. IEnumerable<ClassB>

  3. 在CLass A和ClassB中我都有一个共同的属性。让我们说例如它是EmpId ..

    .Net中是否有内置方法来执行此操作,还是我必须自己编写?

4 个答案:

答案 0 :(得分:2)

假设你可以将公共属性提取到一个公共界面,让我们说IEmployee,那么你可以只有Cast()然后Concatenate集合:

classAItems.Cast<IEmployee>().Concat(classBItems)

请注意,这只会根据需要迭代这些IEnumerable。如果您想要在合并它们时创建包含两个序列内容的List,可以使用ToList()

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

如果您只需要使用ToArray()的数组,则可以执行相同操作。

答案 1 :(得分:2)

您可以轻松获得连锁的公共财产:

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

如果这不是你想要的,你必须更具体。

答案 2 :(得分: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的公共属性,

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 });

答案 3 :(得分:1)

你可以根据最小公分数来结束它们,在你的情况下是object

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

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

但这不会给你太多,你必须在c集合中运行时检查对象类型。

您可以创建一个更好的公分母,例如某个界面IClass,其具有EmpId属性,并由ClassAClassB实现。

如果您不关心Intellisense,可以尝试使用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