2012-11-27 113 views
0

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

例如,如果我有一个巴士(带有一个属性'busID')和一个驱动程序列表(也带有一个属性'busID')列表。我可以在哪里创建一个新的列表(buses.busesID = drivers.busID)?

我意识到这个问题很模糊,并且不包含任何示例代码。尽管如此,我仍然陷入困境。

+0

功课?如果是这样,请将其标记为这样。 –

+0

和什么新的列表?公交车?驱动程序?或每个元组? – Enigmativity

+0

@ChristopherEstep“家庭作业”标签已被弃用,不应再使用。 –

回答

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(); 
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本身,或anonymous type定义。

结果是一个查询,该查询懒惰地执行并产生一组总线+驱动程序对。

+0

我正在寻找'分配'司机到公共汽车。我认为这将是一个简单的解决方案,列出将使用某个总线的所有驱动程序。这种方法可以正常工作,或者您知道更优雅的解决方案吗? – user1769279

+0

看看其他的LINQ方法,他们提供了很多方法来查看集合 - 你可以过滤它们,项目项目,聚合项目...如果你想列出指定总线的驱动程序,这是一个简单的过滤器('Where'方法/子句)。 ** [101 LINQ示例](http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b)**在开始的时候给了我很多帮助。 –

+0

非常感谢帮助的人!我怎样才能将这个查询的结果元组添加到可以在WinForms列表框中显示的列表中? – user1769279

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 
    } 

旁注:元组是一个.NET 4类,如果不能使用,那么你可以很容易地编写自己:Equivalent of Tuple (.NET 4) for .NET Framework 3.5

相关问题