Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ从多个列表中选择_C#_Linq - Fatal编程技术网

C# 使用LINQ从多个列表中选择

C# 使用LINQ从多个列表中选择,c#,linq,C#,Linq,我有多张班级名单 public class MainClass { public List<A> a{ get; set; } public List<B> b{ get; set; } public List<C> c{ get; set; } } 现在,我如何从列表b&c中获取数据并将其传递给A这就是我所尝试的 List<A> query = (from b in MainClass.b join c

我有多张班级名单

public class MainClass
{
 public List<A> a{ get; set; }
 public List<B> b{ get; set; }
 public List<C> c{ get; set; }
}
现在,我如何从列表b&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});
List query=(来自MainClass.b中的b
在Mainclass.c中加入c
关于b.ID等于c.ID
选择新的{b.Address,c.Name});

如何将C中的名称显示为A中的主地址

如果我错了,请更正我,但我认为您需要的是一个包含C列表中的主地址的列表。 如果是:

编辑: 我继续做了一个完整的工作示例,以便您可以检查您的错误

  • A、 B、B和C类必须与A、B和C属性具有相同的可见性
  • 您正在静态访问b和c,但它们是实例变量
当然,通过直接在可枚举实例上调用ToList选择器,可以一步完成从可枚举到列表的转换

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
{
班级计划
{
静态void Main(字符串[]参数)
{
var mainClass=新的mainClass();
mainClass.b=新列表();
mainClass.c=新列表();
mainClass.b.Add(新的b{ID=1,Address=“B1”});
mainClass.c.Add(新的c{ID=1,Name=“C1”});
//使用LINQ
var query=(来自mainClass.b中的b)
在mainClass.c中加入c
关于b.ID等于c.ID
选择新地址{MainAddress=c.Name});
List fromLINQ=query.ToList();
//使用匿名函数或lambda表达式
IEnumerable enumerableFromAnonymous=mainClass.b.Join(mainClass.c,x=>x.ID,x=>x.ID,(x,y)=>{return new A(){MainAddress=y.Name};});
List listFromAnonymous=EnumerableRomanonymous.ToList();
}
}
公共类主类
{
公共列表a{get;set;}
公共列表b{get;set;}
公共列表c{get;set;}
}
公共A类
{
公共字符串名称{get;set;}
公共字符串主地址{get;set;}
}
公共B级
{
公共int ID{get;set;}
公共字符串地址{get;set;}
}
公共C类
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
}

以下是演示代码的完整片段:

要从B获取显示为A中主地址的地址,请执行以下操作:

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
类型

输出:


我认为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();

您需要的是它们之间的连接操作,基于它们都具有的ID属性。这个问题的答案告诉你:@AvnerShahar Kashtan我不是问如何加入,我只是问我如何从一个列表显示到另一个列表。不清楚你想做什么<代码>选择新{b.b,c.c}未编译,因为
b
c
没有属性
b
c
。是否要使用其他集合的所有链接的
Name+Address
属性初始化
MainClass.a
?如果是这样,您想如何在a.ID等于b.ID上构建
main地址?
无效,因为
a
尚未在任何地方定义。@TimSchmelter,那是一个打字错误。编辑我猜他想要
mainClass.a=query.ToList()
@Sam您能检查上面的mdified查询吗?查询似乎很好。必须在使用语句的代码中可见。它返回A的IEnumerable,正如Tim在上面评论的那样,它可以通过query.ToList()枚举到A的列表中。@Jaycee谁说可以调用两次ToList?事实上,在我的代码列表中,没有任何地方在同一个可枚举项上被多次调用。。。
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
             };
   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();