我有两个IEnumerable<T>
个实例(不同的T)。我想把它们两者结合起来。
IEnumerable<ClassA>
IEnumerable<ClassB>
在CLass A和ClassB中我都有一个共同的属性。让我们说例如它是EmpId ..
.Net中是否有内置方法来执行此操作,还是我必须自己编写?
答案 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
的第三种类型,它将包含classA
和classB
的公共属性,
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
属性,并由ClassA
和ClassB
实现。
如果您不关心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
。