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,但它们是实例变量
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();