0

我有 2 个列表,其中包含 2 种不同类型的对象。是否可以比较两个列表中的对象并创建一个包含具有匹配属性值的对象的新列表?

例如,如果我有一个公共汽车列表(带有属性'busID')和一个司机列表(也带有属性'busID')。我可以在哪里(buses.busesID = drivers.busID)创建一个新列表吗?

我意识到这个问题很模糊,不包含示例代码。不过,我被困在这里了。

4

3 回答 3

1

您可以使用 LINQ 在此 ID 上加入这两个集合,例如生成一个总线及其驱动程序的元组。使用 LINQ 语法,它看起来像这样:

var result = from bus in buses
             join driver in drivers on bus.busID equals driver.busID
             select new { Bus = bus, Driver = driver }

这可能会为您引入几个新功能,例如LINQ本身或匿名类型定义。

结果是一个查询,它被懒惰地执行并产生一个总线+司机对的集合。

于 2012-11-27T00:39:47.470 回答
0

如果您追求更抽象的解决方案,那么您可以使用反射。

    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

于 2012-11-27T00:57:37.720 回答
0

尝试这个:

var query =
    from driver in drivers
    join bus in buses on driver.busID equals bus.busID
    select new { driver, bus };

var results = query.ToList();
于 2012-11-27T00:39:41.070 回答