使用LINQ从多个列表中选择

时间:2015-04-29 10:12:19

标签: c# linq

我有多个班级列表。

public class MainClass
{
 public List<A> a{ get; set; }
 public List<B> b{ get; set; }
 public List<C> c{ get; set; }
}

主要类包含以下属性

 class A
    {
      public string Name{ get; set; }
      public string MainAddress{get;set;}
    }

    class B
    {
      public int ID {get;set;}
      public string Address{ get; set; }
    }

    class C
    {
     public int ID {get;set;}
      public string Name{ get; set; }
    }

现在我如何从列表b&amp;获取数据? c 并将其传递给 A 这是我试过的

  List<A> query = (from b in MainClass.b
               join c in Mainclass.c
                on b.ID equals c.ID
                select new {b.Address, c.Name});

如何在C中将名称显示为A

中的主要地址

3 个答案:

答案 0 :(得分:2)

如果我错了,请纠正我,但我认为你想要的是A列表中有来自c列表的MainAddresses。 如果是这样的话:

 var query = (from b in MainClass.b
               join c in Mainclass.c
                on b.ID equals c.ID
                select new A { MainAddress = c.Name });

修改: 我继续做了一个完整的工作示例,以便你可以检查你的错误......

  • A,B和C类必须具有与a,b和c属性相同的可见性。
  • 您正在静态访问b和c,但它们是实例变量。

当然,通过直接在Enumerable实例上调用ToList选择器,可以一步完成从Enumerable到List的转换。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var mainClass = new MainClass();

            mainClass.b = new List<B>();
            mainClass.c = new List<C>();
            mainClass.b.Add(new B { ID = 1, Address = "B1" });
            mainClass.c.Add(new C { ID = 1, Name = "C1" });

            //using LINQ
            var query = (from b in mainClass.b
                         join c in mainClass.c
                          on b.ID equals c.ID
                         select new A { MainAddress = c.Name });

            List<A> fromLINQ = query.ToList();

            //using anonymous functions aka lambda expressions
            IEnumerable<A> enumerableFromAnonymous = mainClass.b.Join(mainClass.c, x => x.ID, x => x.ID, (x, y) => { return new A() { MainAddress = y.Name }; });
            List<A> listFromAnonymous = enumerableFromAnonymous.ToList();
        }
    }

    public class MainClass
    {
        public List<A> a { get; set; }
        public List<B> b { get; set; }
        public List<C> c { get; set; }
    }

    public class A
    {
        public string Name { get; set; }
        public string MainAddress { get; set; }
    }

    public class B
    {
        public int ID { get; set; }
        public string Address { get; set; }
    }

    public class C
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
}

答案 1 :(得分:2)

下面是演示代码的完整代码段:http://share.linqpad.net/aq8f6c.linq

要将B中的地址显示为A中的Mainadress,请执行以下操作:

var result = from a in As
             join b in (from b in Bs
                        join c in Cs
                        on b.ID equals c.ID
                        select new {b.Address, c.Name})
             on a.Name equals b.Name
             select new A {
                 Name = a.Name,
                 MainAddress = b.Address
             };

result则为Ienumerable<A>类型。

输出:

enter image description here

答案 2 :(得分:0)

我认为Serv的例子是正确的答案,但我不喜欢查询语法,因为我发现由于Visual Studio无法在即时窗口中支持Lambda表达式而难以阅读和维护 - 自VS2013起。

我更喜欢使用中间变量的方法语法。这节省了屏幕空间,我认为它更容易理解:

   var query = from a in As
                join c in (from b in Bs
                           join c in Cs
                           on b.ID equals c.ID
                           select new {b.Address, c.Name})
                on a.Name equals c.Name
                select new A {
                    Name = a.Name,
                    MainAddress = c.Address
                };
    query.Dump();

    //method sytnax
    var nameAddress = Bs.Join(Cs, b => b.ID, c => c.ID, (b, c) => new { Name = c.Name, Address = b.Address });
    var query2 = As.Join(nameAddress, a => a.Name, na => na.Name, (a, na) => new { Name = a.Name, MainAddress = na.Address});
    query2.Dump();