连接两个不同类型的ienumerable

本文关键字:同类型 ienumerable 两个 连接 | 更新日期: 2023-09-27 18:11:57

我有两个IEnumerable<T>实例(具有不同的T),我想将它们合并。

  1. IEnumerable<ClassA>

  2. IEnumerable<ClassB>

在类A和类b中,我有一个共同的属性。例如,它是EmpId ..

是否有一个内置的方法在。net做到这一点,还是我必须自己写?

连接两个不同类型的ienumerable

假设您可以将公共属性提取到公共接口,例如IEmployee,那么您可以仅Cast(),然后连接集合:

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

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

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

如果你只需要一个使用ToArray()的数组,你也可以这样做。

您可以很容易地获得连接的公共属性:

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

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

您不能在一个序列中组合两个不同类型的序列,除非您将它们的一些属性投射到一个公共类型中并创建该类型的序列。

例如,让我们有以下两个类:

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

您可以根据最小公分母将它们连接起来,在您的情况下是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实现。

如果你不关心智能感知,你可以尝试使用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