Linq常見操作示例
static void DeferredQuery()
{
var names = new List<string> { "Nino", "Alberto", "Juan", "Mike", "Phil" };var namesWithJ = from n in names where n.StartsWith("J") orderby n select n; Console.WriteLine("First iteration"); foreach (string name in namesWithJ) { Console.WriteLine(name); } Console.WriteLine(); names.Add("John"); names.Add("Jim"); names.Add("Jack"); names.Add("Denny"); Console.WriteLine("Second iteration"); foreach (string name in namesWithJ) { Console.WriteLine(name); } /* First iteration Juan second iteration Jack Jim John Juan */
}
//如查詢出來自巴西的所有世界冠軍,并按照奪冠次數排序
static void LINQQuery()
{
var query = from r in Formula1.GetChampions()
where r.Country == "Brazil"
orderby r.Wins descending
select r;foreach (var r in query) { Console.WriteLine("{0:A}", r); }
}
//Zip合并功能
static void ZipOperation()
{
var racerNames = from r in Formula1.GetChampions()
where r.Country == "Italy"
orderby r.Wins descending
select new
{
Name = r.FirstName + " " + r.LastName
};var racerNamesAndStarts = from r in Formula1.GetChampions() where r.Country == "Italy" orderby r.Wins descending select new { LastName = r.LastName, Starts = r.Starts }; //var racers = racerNames.Zip(racerNamesAndStarts, (first, second) => first.Name + ", starts: " + second.Starts); //foreach (var r in racers) //{ // Console.WriteLine(r); //}
}
//根據賽手獲得一級方程式冠軍的次數,列出最成功的國家
static void Aggregate2()
{
var countries = (from c in
from r in Formula1.GetChampions()
group r by r.Country into c
select new
{
Country = c.Key,
Wins = (from r1 in c
select r1.Wins).Sum()
}
orderby c.Wins descending, c.Country
select c).Take(5);foreach (var country in countries) { Console.WriteLine("{0} {1}", country.Country, country.Wins); }
}
//篩選賽手,只返回獲得冠軍次數超過3次的賽手
static void Aggregate()
{
var query = from r in Formula1.GetChampions()
where r.Years.Count() > 3
orderby r.Years.Count() descending
select new
{
Name = r.FirstName + " " + r.LastName,
TimesChampion = r.Years.Count()
};foreach (var r in query) { Console.WriteLine("{0} {1}", r.Name, r.TimesChampion); }
}
//Linq分頁顯示
static void Partitioning()
{
int pageSize = 5;int numberPages = (int)Math.Ceiling(Formula1.GetChampions().Count() / (double)pageSize); for (int page = 0; page < numberPages; page++) { Console.WriteLine("Page {0}", page); var racers = (from r in Formula1.GetChampions() orderby r.LastName select r.FirstName + " " + r.LastName). Skip(page * pageSize).Take(pageSize); foreach (var name in racers) { Console.WriteLine(name); } Console.WriteLine(); }
}
//有駕駛法拉利和邁凱輪的冠軍,集合交集
static void SetOperations()
{
Func<string, IEnumerable<Racer>> racersByCar =
car => from r in Formula1.GetChampions()
from c in r.Cars
where c == car
orderby r.LastName
select r;Console.WriteLine("World champion with Ferrari and McLaren"); foreach (var racer in racersByCar("Ferrari").Intersect(racersByCar("McLaren"))) { Console.WriteLine(racer); }
}
//列出每年的賽手冠軍和車隊冠軍
static void Join()
{
var racers = from r in Formula1.GetChampions()
from y in r.Years
where y > 2003
select new
{
Year = y,
Name = r.FirstName + " " + r.LastName
};var teams = from t in Formula1.GetContructorChampions() from y in t.Years where y > 2003 select new { Year = y, Name = t.Name }; var racersAndTeams = from r in racers join t in teams on r.Year equals t.Year select new { Year = r.Year, Racer = r.Name, Team = t.Name }; Console.WriteLine("Year Champion " + "Constructor Title"); foreach (var item in racersAndTeams) { Console.WriteLine("{0}: {1,-20} {2}", item.Year, item.Racer, item.Team); }
}
//現在一級方程式冠軍應按照國家分組,并列出一個國家的冠軍數以及包含賽手名序列
static void GroupingWithNestedObjects()
{
var countries = from r in Formula1.GetChampions()
group r by r.Country into g
orderby g.Count() descending, g.Key
where g.Count() >= 2
select new
{
Country = g.Key,
Count = g.Count(),
Racers = from r1 in g
orderby r1.LastName
select r1.FirstName + " " + r1.LastName
};
foreach (var item in countries)
{
Console.WriteLine("{0, -10} {1}", item.Country, item.Count);
foreach (var name in item.Racers)
{
Console.Write("{0}; ", name);
}
Console.WriteLine();
}}
static void Grouping()
{
var countries = from r in Formula1.GetChampions()
group r by r.Country into g
orderby g.Count() descending, g.Key
where g.Count() >= 2
select new
{
Country = g.Key,
Count = g.Count()
};foreach (var item in countries) { Console.WriteLine("{0, -10} {1}", item.Country, item.Count); }
}
//顯示駕駛法拉利的所有一級方程式冠軍名字
static void CompoundFrom()
{
var ferrariDrivers = from r in Formula1.GetChampions()
from c in r.Cars
where c == "Ferrari"
orderby r.LastName
select r.FirstName + " " + r.LastName;foreach (var racer in ferrariDrivers) { Console.WriteLine(racer); }
}
static void TypeFiltering()
{
object[] data = { "one", 2, 3, "four", "five", 6 };
var query = data.OfType<string>();
foreach (var s in query)
{
Console.WriteLine(s);
}
/ one four five /
}//使用索引返回姓氏以A開頭、索引為偶數的賽手
static void IndexFiltering()
{
var racers = Formula1.GetChampions().
Where((r, index) => r.LastName.StartsWith("A") && index % 2 != 0);
foreach (var r in racers)
{
Console.WriteLine("{0:A}", r);
}}
//找出贏得至少 15場比賽的巴西和奧地利賽手
static void Filtering()
{
var racers = from r in Formula1.GetChampions()
where r.Wins > 15 && (r.Country == "Brazil" || r.Country == "Austria")
select r;foreach (var r in racers) { Console.WriteLine("{0:A}", r); }
}
//取消Linq并行操作
static void Cancellation()
{
const int arraySize = 100000000;
var data = new int[arraySize];
var r = new Random();
for (int i = 0; i < arraySize; i++)
{
data[i] = r.Next(40);
}var cts = new CancellationTokenSource(); new Thread(() => { try { var sum = (from x in data.AsParallel().WithCancellation(cts.Token) where x < 80 select x).Sum(); Console.WriteLine("query finished, sum: {0}", sum); } catch (OperationCanceledException ex) { Console.WriteLine(ex.Message); } }).Start(); Console.WriteLine("query started"); Console.Write("cancel? "); int input = Console.Read(); if (input == 'Y' || input == 'y') { // cancel! cts.Cancel(); }
}
//Linq 并行操作
static void IntroParallel()
{
const int arraySize = 100000000;
var data = new int[arraySize];
var r = new Random();
for (int i = 0; i < arraySize; i++)data[i] = r.Next(40);
Stopwatch watch = new Stopwatch(); watch.Start(); var q1 = (from x in Partitioner.Create(data).AsParallel() where x < 80 select x).Sum(); watch.Stop(); Console.WriteLine(watch.ElapsedMilliseconds);
} </pre>