我有 2 个列表,其中包含 2 种不同类型的对象。是否可以比较两个列表中的对象并创建一个包含具有匹配属性值的对象的新列表?
例如,如果我有一个公共汽车列表(带有属性'busID')和一个司机列表(也带有属性'busID')。我可以在哪里(buses.busesID = drivers.busID)创建一个新列表吗?
我意识到这个问题很模糊,不包含示例代码。不过,我被困在这里了。
如果您追求更抽象的解决方案,那么您可以使用反射。
class A
{
public int x { get; set; }
public int y { get; set; }
}
class B
{
public int y { get; set; }
public int z { get; set; }
}
static List<A> listA = new List<A>();
static List<B> listB = new List<B>();
static void Main(string[] args)
{
listA.Add(new A {x = 0, y = 1});
listA.Add(new A {x = 0, y = 2});
listB.Add(new B {y = 2, z = 9});
listB.Add(new B {y = 3, z = 9});
// get all properties from classes A & B and find ones with matching names and types
var propsA = typeof(A).GetProperties();
var propsB = typeof(B).GetProperties();
var matchingProps = new List<Tuple<PropertyInfo, PropertyInfo>>();
foreach (var pa in propsA)
{
foreach (var pb in propsB)
{
if (pa.Name == pb.Name && pa.GetType() == pb.GetType())
{
matchingProps.Add(new Tuple<PropertyInfo, PropertyInfo>(pa, pb));
}
}
}
// foreach matching property, get the value from each element in list A and try to find matching one from list B
var matchingAB = new List<Tuple<A, B>>();
foreach (var mp in matchingProps)
{
foreach (var a in listA)
{
var valA = mp.Item1.GetValue(a, null);
foreach (var b in listB)
{
var valB = mp.Item2.GetValue(b, null);
if (valA.Equals(valB))
{
matchingAB.Add(new Tuple<A, B>(a, b));
}
}
}
}
Console.WriteLine(matchingAB.Count); // this prints 1 in this case
}
旁注:Tuple 是一个 .NET 4 类,如果您不能使用它,那么您可以轻松编写自己的:Equivalent of Tuple (.NET 4) for .NET Framework 3.5
尝试这个:
var query =
from driver in drivers
join bus in buses on driver.busID equals bus.busID
select new { driver, bus };
var results = query.ToList();