Linq将两个不同类的列表与join配对



我有下面的代码

var allA = // holds a List<classA>
var allB = //holds a List<ClassB>
var res = from A in allA
join B in allB on A.Id equals B.Id
select new Tuple<string,string,string,string,string>        
(B.val1,B.val2,A.val1,A.val2,A.val3);
var resList = res as List<Tuple<string, string, string, string, string>>;

现在的问题是,按照我的做法,我必须记住元组中的哪个项具有什么值。我也不明白resList = res as a List<Tuple<...>>为什么不起作用,它没有任何值。

如果我有一个List<Tuple<ClassA,ClassB>>,并且在每个元组中,ClassA和ClassB是Linq-select语句中的连接对,我该如何构建它?

让我们考虑以下两个类并列出

class A { 
public int Id {get;set;}
public string Name {get;set;}
}
class B { 
public int Id {get;set;}
public decimal Size {get;set;}
}
(...) 
var la = new A[]{ new A { Id = 1, Name = "Snake"}, new A { Id = 2, Name = "Adam"}};

var lb = new B[]{ new B { Id = 1, Size = 0.8m}, new B { Id = 2, Size = 1}};

您可以创建具有两个属性的对象:

var lab = from a in la
join b in lb on a.Id equals b.Id
select new {a, b}; // or select new { A = a, B = b};

我使用了匿名类型,但您可以创建一个具有两个属性a和B的类型并使用它。

如果您想要一个元组,请使用带有命名字段的现代元组:

select (A: a, B: b);

话虽如此,也许一个具有您所需属性的对象是最佳选择。

var lab = from a in la
join b in lb on a.Id equals b.Id
select new  
{ 
Id = a.Id, 
Name = a.Name,
Size = b.Size
};

最新更新