求大神,只要 linq,不要 foreach
企业(E)有多个产品(P),产品(P)有多个问卷调查(S)。
用 linq 得出 Es 中所有产品和调查的清单,用匿名类表示。
class E {
public string Name { get; set; }
public List<P> Ps { get; set; }
}
class P {
public string Name { get; set; }
public List<S> Ss { get; set; }
public DateTime PublishedDate { get; set; }
}
class S {
public string Name { get; set; }
public DateTime PublishedDate { get; set; }
}
class Program {
static void Main(string[] args) {
var e1p1s1 = new S() { Name = "e1p1s1" };
var e1p1s2 = new S() { Name = "e1p1s2" };
var e1p1s3 = new S() { Name = "e1p1s3" };
var e1p1s4 = new S() { Name = "e1p1s4" };
var e1p2s1 = new S() { Name = "e1p2s1" };
var e1p2s2 = new S() { Name = "e1p2s2" };
var e2p1s1 = new S() { Name = "e2p1s1" };
var e2p1s2 = new S() { Name = "e2p1s2" };
var e2p1s3 = new S() { Name = "e2p1s3" };
var e2p1s4 = new S() { Name = "e2p1s4" };
var e2p2s1 = new S() { Name = "e2p2s1" };
var e2p2s2 = new S() { Name = "e2p2s2" };
var e2p2s3 = new S() { Name = "e2p2s3" };
var e2p3s1 = new S() { Name = "e2p3s1" };
var e2p3s2 = new S() { Name = "e2p3s2" };
var e1p1 = new P() {
Name = "e1p1",
Ss = new List<S>() {
e1p1s1, e1p1s2, e1p1s3, e1p1s4
}
};
var e1p2 = new P() {
Name = "e1p2", Ss = new List<S>() {
e1p2s1, e1p2s2
}
};
var e2p1 = new P() {
Name = "e2p1", Ss = new List<S>() {
e2p1s1, e2p1s2, e2p1s3, e2p1s4
}
};
var e2p2 = new P() {
Name = "e2p2", Ss = new List<S>() {
e2p2s1, e2p2s2, e2p2s3
}
};
var e2p3 = new P() {
Name = "e2p3", Ss = new List<S>() {
e2p3s1, e2p3s2
}
};
var e1 = new E() {
Name = "e1",
Ps = new List<P>() {
e1p1, e1p2
}
};
var e2 = new E() {
Name = "e2",
Ps = new List<P>() {
e2p1, e2p2, e2p3
}
};
var Es = new List<E>() { e1, e2 };
}
}
Es初始化完成,求神人不用 foreach、ToList().ForEach()完成返回一个IEnumerable<T>,T 为具有如下属性的匿名类型:
Type: 元素的类型,为 P 或 S。
Name: P 或 S 的 Name。
PublishedDate: P 或 S 的 PublishedDate。
以下为预期效果:
Index Type:Name: PublishedDate:
1 P E1P1
2 P E1P2
3 P E1P3
4 P E1P1S1
5 P E1P1S2
. ..
. ..
. ..
18 P E2P3S2
自从会了linq,能不用foreach就不用了。现在变得完全不想用了。
[解决办法]
本帖最后由 q107770540 于 2012-12-16 20:52:59 编辑
void Main()
{
var e1p1s1 = new S() { Name = "e1p1s1" };
var e1p1s2 = new S() { Name = "e1p1s2" };
var e1p1s3 = new S() { Name = "e1p1s3" };
var e1p1s4 = new S() { Name = "e1p1s4" };
var e1p2s1 = new S() { Name = "e1p2s1" };
var e1p2s2 = new S() { Name = "e1p2s2" };
var e2p1s1 = new S() { Name = "e2p1s1" };
var e2p1s2 = new S() { Name = "e2p1s2" };
var e2p1s3 = new S() { Name = "e2p1s3" };
var e2p1s4 = new S() { Name = "e2p1s4" };
var e2p2s1 = new S() { Name = "e2p2s1" };
var e2p2s2 = new S() { Name = "e2p2s2" };
var e2p2s3 = new S() { Name = "e2p2s3" };
var e2p3s1 = new S() { Name = "e2p3s1" };
var e2p3s2 = new S() { Name = "e2p3s2" };
var e1p1 = new P() {
Name = "e1p1",
Ss = new List<S>() {
e1p1s1, e1p1s2, e1p1s3, e1p1s4
}
};
var e1p2 = new P() {
Name = "e1p2", Ss = new List<S>() {
e1p2s1, e1p2s2
}
};
var e2p1 = new P() {
Name = "e2p1", Ss = new List<S>() {
e2p1s1, e2p1s2, e2p1s3, e2p1s4
}
};
var e2p2 = new P() {
Name = "e2p2", Ss = new List<S>() {
e2p2s1, e2p2s2, e2p2s3
}
};
var e2p3 = new P() {
Name = "e2p3", Ss = new List<S>() {
e2p3s1, e2p3s2
}
};
var e1 = new E() {
Name = "e1",
Ps = new List<P>() {
e1p1, e1p2
}
};
var e2 = new E() {
Name = "e2",
Ps = new List<P>() {
e2p1, e2p2, e2p3
}
};
var Es = new List<E>() { e1, e2 };
int i=1;
var query=(from x in Es
from y in x.Ps
select new Result{Index=i++,Type="P",Name=y.Name,PublishedDate=y.PublishedDate}).Concat
(
from x in Es
from y in x.Ps
from z in y.Ss
select new Result{Index=i++,Type="S",Name=z.Name,PublishedDate=z.PublishedDate}
);
Console.WriteLine("Index\tName\tType\tPublishedDate");
query.ToList().ForEach(q=>Console.WriteLine("{0}\t{1}\t{2}\t{3}",q.Index,q.Name,q.Type,q.PublishedDate));
/*
IndexNameTypePublishedDate
1e1p1P0001/1/1 0:00:00
2e1p2P0001/1/1 0:00:00
3e2p1P0001/1/1 0:00:00
4e2p2P0001/1/1 0:00:00
5e2p3P0001/1/1 0:00:00
6e1p1s1S0001/1/1 0:00:00
7e1p1s2S0001/1/1 0:00:00
8e1p1s3S0001/1/1 0:00:00
9e1p1s4S0001/1/1 0:00:00
10e1p2s1S0001/1/1 0:00:00
11e1p2s2S0001/1/1 0:00:00
12e2p1s1S0001/1/1 0:00:00
13e2p1s2S0001/1/1 0:00:00
14e2p1s3S0001/1/1 0:00:00
15e2p1s4S0001/1/1 0:00:00
16e2p2s1S0001/1/1 0:00:00
17e2p2s2S0001/1/1 0:00:00
18e2p2s3S0001/1/1 0:00:00
19e2p3s1S0001/1/1 0:00:00
20e2p3s2S0001/1/1 0:00:00
*/
}
class Result
{
public int Index { get; set; }
public string Name { get; set; }
public string Type { get; set; }
public DateTime PublishedDate { get; set; }
}
class E {
public string Name { get; set; }
public List<P> Ps { get; set; }
}
class P {
public string Name { get; set; }
public List<S> Ss { get; set; }
public DateTime PublishedDate { get; set; }
}
class S {
public string Name { get; set; }
public DateTime PublishedDate { get; set; }
}