.NET Reflector on IL generated by C# 3.0 (LINQ)
Nothing like using .NET Reflector. The following C# code:
public class Student {
public string First { get; set; }
public string Last { get; set; }
public int ID {get; set;}
public int[] Scores;
}
class Program {
static void Main(string[] args) {
List<Student> students = new List<Student> { new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new int[] {97, 92, 81, 60}},
new Student {First="Claire", Last="O’Donnell", ID=112, Scores= new int[] {75, 84, 91, 39}},
new Student {First="Sven", Last="Mortensen", ID=113, Scores= new int[] {88, 94, 65, 91}},
new Student {First="Cesar", Last="Garcia", ID=114, Scores= new int[] {97, 89, 85, 82}},
new Student {First="Debra", Last="Garcia", ID=115, Scores= new int[] {35, 72, 91, 70}},
new Student {First="Fadi", Last="Fakhouri", ID=116, Scores= new int[] {99, 86, 90, 94}},
new Student {First="Hanying", Last="Feng", ID=117, Scores= new int[] {93, 92, 80, 87}},
new Student {First="Hugo", Last="Garcia", ID=118, Scores= new int[] {92, 90, 83, 78}},
new Student {First="Lance", Last="Tucker", ID=119, Scores= new int[] {68, 79, 88, 92}},
new Student {First="Terry", Last="Adams", ID=120, Scores= new int[] {99, 82, 81, 79}},
new Student {First="Eugene", Last="Zabokritski", ID=121, Scores= new int[] {96, 85, 91, 60}},
new Student {First="Michael", Last="Tucker", ID=122, Scores= new int[] {94, 92, 91, 91} }
};
IEnumerable<Student> studentQuery = from student in students
where student.Scores[0] > 90 && student.Scores[3] < 80
orderby student.Scores[0] descending
select student;
foreach (Student s in studentQuery) {
Console.WriteLine("{0}, {1} {2}", s.Last, s.First, s.Scores[0]);
}
IEnumerable<IGrouping<char, Student>> studentQuery2 = from student in students
group student by student.Last[0];
foreach (IGrouping<char, Student> group in studentQuery2) {
Console.WriteLine(group.Key);
foreach (Student s in group) {
Console.WriteLine(" {0}, {1}",
s.Last, s.First);
}
}
}
is actually compiled to something similar to:
…
private static void Main(string[] args) {
Student s;
IEnumerator<Student> CS$5$0000;
List<Student> <>g__initLocal0 = new List<Student>();
Student <>g__initLocal1 = new Student();
<>g__initLocal1.First = "Svetlana";
<>g__initLocal1.Last = "Omelchenko";
<>g__initLocal1.ID = 0x6f;
<>g__initLocal1.Scores = new int[] { 0x61, 0x5c, 0x51, 60 };
<>g__initLocal0.Add(<>g__initLocal1);
Student <>g__initLocal2 = new Student();
<>g__initLocal2.First = "Claire";
<>g__initLocal2.Last = "O\u2019Donnell";
<>g__initLocal2.ID = 0x70;
<>g__initLocal2.Scores = new int[] { 0x4b, 0x54, 0x5b, 0x27 };
<>g__initLocal0.Add(<>g__initLocal2);
Student <>g__initLocal3 = new Student();
<>g__initLocal3.First = "Sven";
<>g__initLocal3.Last = "Mortensen";
<>g__initLocal3.ID = 0x71;
<>g__initLocal3.Scores = new int[] { 0x58, 0x5e, 0x41, 0x5b };
<>g__initLocal0.Add(<>g__initLocal3);
Student <>g__initLocal4 = new Student();
<>g__initLocal4.First = "Cesar";
<>g__initLocal4.Last = "Garcia";
<>g__initLocal4.ID = 0x72;
<>g__initLocal4.Scores = new int[] { 0x61, 0x59, 0x55, 0x52 };
<>g__initLocal0.Add(<>g__initLocal4);
Student <>g__initLocal5 = new Student();
<>g__initLocal5.First = "Debra";
<>g__initLocal5.Last = "Garcia";
<>g__initLocal5.ID = 0x73;
<>g__initLocal5.Scores = new int[] { 0x23, 0x48, 0x5b, 70 };
<>g__initLocal0.Add(<>g__initLocal5);
Student <>g__initLocal6 = new Student();
<>g__initLocal6.First = "Fadi";
<>g__initLocal6.Last = "Fakhouri";
<>g__initLocal6.ID = 0x74;
<>g__initLocal6.Scores = new int[] { 0x63, 0x56, 90, 0x5e };
<>g__initLocal0.Add(<>g__initLocal6);
Student <>g__initLocal7 = new Student();
<>g__initLocal7.First = "Hanying";
<>g__initLocal7.Last = "Feng";
<>g__initLocal7.ID = 0x75;
<>g__initLocal7.Scores = new int[] { 0x5d, 0x5c, 80, 0x57 };
<>g__initLocal0.Add(<>g__initLocal7);
Student <>g__initLocal8 = new Student();
<>g__initLocal8.First = "Hugo";
<>g__initLocal8.Last = "Garcia";
<>g__initLocal8.ID = 0x76;
<>g__initLocal8.Scores = new int[] { 0x5c, 90, 0x53, 0x4e };
<>g__initLocal0.Add(<>g__initLocal8);
Student <>g__initLocal9 = new Student();
<>g__initLocal9.First = "Lance";
<>g__initLocal9.Last = "Tucker";
<>g__initLocal9.ID = 0x77;
<>g__initLocal9.Scores = new int[] { 0x44, 0x4f, 0x58, 0x5c };
<>g__initLocal0.Add(<>g__initLocal9);
Student <>g__initLocala = new Student();
<>g__initLocala.First = "Terry";
<>g__initLocala.Last = "Adams";
<>g__initLocala.ID = 120;
<>g__initLocala.Scores = new int[] { 0x63, 0x52, 0x51, 0x4f };
<>g__initLocal0.Add(<>g__initLocala);
Student <>g__initLocalb = new Student();
<>g__initLocalb.First = "Eugene";
<>g__initLocalb.Last = "Zabokritski";
<>g__initLocalb.ID = 0x79;
<>g__initLocalb.Scores = new int[] { 0x60, 0x55, 0x5b, 60 };
<>g__initLocal0.Add(<>g__initLocalb);
Student <>g__initLocalc = new Student();
<>g__initLocalc.First = "Michael";
<>g__initLocalc.Last = "Tucker";
<>g__initLocalc.ID = 0x7a;
<>g__initLocalc.Scores = new int[] { 0x5e, 0x5c, 0x5b, 0x5b };
<>g__initLocal0.Add(<>g__initLocalc);
List<Student> students = <>g__initLocal0;
if (Program.<>9__CachedAnonymousMethodDelegate10 == null) {
Program.<>9__CachedAnonymousMethodDelegate10 = new Func<Student, bool>(Program.<Main>b__d);
}
if (Program.<>9__CachedAnonymousMethodDelegate11 == null) {
Program.<>9__CachedAnonymousMethodDelegate11 = new Func<Student, int>(Program.<Main>b__e);
}
IEnumerable<Student> studentQuery = Enumerable.OrderByDescending<Student, int>(Enumerable.Where<Student>(students,
Program.<>9__CachedAnonymousMethodDelegate10),
Program.<>9__CachedAnonymousMethodDelegate11);
using (CS$5$0000 = studentQuery.GetEnumerator()) {
while (CS$5$0000.MoveNext()) {
s = CS$5$0000.Current;
Console.WriteLine("{0}, {1} {2}", s.Last, s.First, s.Scores[0]);
}
}
if (Program.<>9__CachedAnonymousMethodDelegate12 == null) {
Program.<>9__CachedAnonymousMethodDelegate12 = new Func<Student, char>(Program.<Main>b__f);
}
IEnumerable<IGrouping<char, Student>> studentQuery2 = Enumerable.GroupBy<Student, char>(students,
Program.<>9__CachedAnonymousMethodDelegate12);
foreach (IGrouping<char, Student> group in studentQuery2) {
Console.WriteLine(group.Key);
using (CS$5$0000 = group.GetEnumerator()) {
while (CS$5$0000.MoveNext()) {
s = CS$5$0000.Current;
Console.WriteLine(" {0}, {1}", s.Last, s.First);
}
}
}
}
Comments
- Anonymous
February 18, 2007
"Studio" forse non è il termine corretto, dal momento che presuppone un minimo di metodo e, magari, di