我有下面的代码
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
};