Linq常見操作示例

ggkwk 9年前發布 | 1K 次閱讀 C#

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>

 本文由用戶 ggkwk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!