以一个简单的例子来说明:
var developersUsingCSharp =
from d in developers
where d.Language == "C#"
select d.Name;
1)提供对IEnumerable<T>的Extension Method使得它可以将where, select应用到任意实现了IEnumerable<T>接口的对象上;
public static IEnumerable<T> Where<T>(
this IEnumerable<T> source,
Func<T, bool> predicate);
public static IEnumerable<TResult> Select<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TResult> selector);
由此得到演进的No.1形式:
var filteredDevelopers = developers.Where(delegate (Developer d) {
return (d.Language == "C#");
});
2)采用lambda expression实现anonymous delegate;
由此得到演进的No.2形式:
IEnumerable<string> developersUsingCSharp =
developers
.Where(d => d.Language == "C#")
.Select(d => d.Name);
3)C# Compiler将Linq Query Expression翻译成lambda expression的形式。由此得到了对用户最友好的方式。
在有些特殊情况下依然需要使用扩展方法来实现。
Note-1: Group and Into Clause(可以使用LINQPad进行练习)
class Developer
{
public string Name {get; set;}
public string Language {get;set;}
public int Age {get;set;}
}
void Main()
{
Developer[] developers = new Developer[] {
new Developer { Name = "Paolo", Language = "C#", Age = 32 },
new Developer { Name = "Marco", Language = "C#", Age = 37},
new Developer { Name = "Frank", Language = "VB.NET", Age = 48 },
};
var developersGroupedByLanguage =
from d in developers
//group d by d.Language;
group d by new { d.Language, AgeCluster = (d.Age / 10) * 10 };
foreach (var group in developersGroupedByLanguage) {
Console.WriteLine("Language: {0}", group.Key);
foreach (var item in group) {
Console.WriteLine("\t{0}-{1}", item.Name,item.Age);
}
}
var developersGroupedByLanguage2 =
from d in developers
group d by d.Language into developersGrouped
select new {
Language = developersGrouped.Key,
DevelopersCount = developersGrouped.Count()
};
foreach (var group in developersGroupedByLanguage2) {
Console.WriteLine ("Language {0} contains {1} developers",
group.Language, group.DevelopersCount);
}
}
输出结果如下:
Language: { Language = C#, AgeCluster = 30 }
Paolo-32
Marco-37
Language: { Language = VB.NET, AgeCluster = 40 }
Frank-48
Language C# contains 2 developers
Language VB.NET contains 1 developers