来源:C#入门经典第四版
static void Main(string[] args)
{
List<Customer> customers = new List<Customer> {
new Customer { ID="A", City="New York", Country="USA",Region="North America", Sales=9999},
new Customer { ID="B", City="Mumbai", Country="India",Region="Asia", Sales=8888 },
new Customer { ID="C", City="Karachi", Country="Pakistan",Region="Asia", Sales=7777 },
new Customer { ID="D", City="Delhi", Country="India",Region="Asia", Sales=6666 },
new Customer { ID="E", City="S o Paulo", Country="Brazil",Region="South America", Sales=5555 },
new Customer { ID="F", City="Moscow", Country="Russia",Region="Europe", Sales=4444 },
new Customer { ID="G", City="Seoul", Country="Korea", Region="Asia",Sales=3333 },
new Customer { ID="H", City="Istanbul", Country="Turkey",Region="Asia", Sales=2222 },
new Customer { ID="I", City="Shanghai", Country="China", Region="Asia",Sales=1111 },
new Customer { ID="J", City="Lagos", Country="Nigeria",Region="Africa", Sales=1000 },
new Customer { ID="K", City="Mexico City", Country="Mexico",Region="North America", Sales=2000 },
new Customer { ID="L", City="Jakarta", Country="Indonesia",Region="Asia", Sales=3000 },
new Customer { ID="M", City="Tokyo", Country="Japan",Region="Asia", Sales=4000 },
new Customer { ID="N", City="Los Angeles", Country="USA",Region="North America", Sales=5000 },
new Customer { ID="O", City="Cairo", Country="Egypt",Region="Africa", Sales=6000 },
new Customer { ID="P", City="Tehran", Country="Iran",Region="Asia", Sales=7000 },
new Customer { ID="Q", City="London", Country="UK",Region="Europe", Sales=8000 },
new Customer { ID="R", City="Beijing", Country="China",Region="Asia", Sales=9000 },
new Customer { ID="S", City="Bogot á ", Country="Colombia",Region="South America", Sales=1001 },
new Customer { ID="T", City="Lima", Country="Peru",Region="South America", Sales=2002 }
};
var queryResult = from c in customers where c.Region == "Asia" select c;
foreach (Customer customer in queryResult)
{
Console.WriteLine(customer);
}
var queryResult2 = from c in customers where c.Region == "Asia" select new { c.City, c.Country, c.Region };
foreach (var item in queryResult2)
{
Console.WriteLine(item);
}
Console.WriteLine();
var queryResult3 = (from c in customers select c.Region).Distinct();
Console.WriteLine("Different Regions:");
foreach (var item in queryResult3)
{
Console.WriteLine(item);
}
//Any和All的用法
Console.WriteLine();
bool anyUSA = customers.Any(c => c.Country == "USA");
if (anyUSA)
Console.WriteLine("Some customers are in the USA");
else
Console.WriteLine("No customers are in the USA");
bool allAsia = customers.All(c => c.Region == "Asia");
if (allAsia)
Console.WriteLine("All customers are in Asia");
else
Console.WriteLine("Not all customers are in Asia");
//组合查询
Console.WriteLine();
Console.WriteLine("Group by:");
var queryResult4 = from c in customers group c by c.Region into cg select new { TotalSales = cg.Sum(c => c.Sales), Region = cg.Key };
var orderResult = from cg in queryResult4 orderby cg.TotalSales descending select cg;
Console.WriteLine("Total\t: By\nSales\t:Region\n-----\t------");
foreach (var item in orderResult)
{
Console.WriteLine(item.TotalSales + "\t: " + item.Region);
}
//Take()和Skip()是两个相反的方法,需要结合orderby字句一起使用
//Take():获取前n个结果
//Skip():跳过前n个结果,返回剩余的结果。
var queryResult5 = from c in customers orderby c.Sales descending select new { c.ID, c.City, c.Country, c.Sales };
Console.WriteLine("Top Five Customers by Sales");
foreach (var item in queryResult5.Take(5))
{
Console.WriteLine(item);
}
Console.WriteLine("Customers Not in Top Five");
foreach (var item in queryResult5.Skip(5))
{
Console.WriteLine(item);
}
//First()方法返回结果集中第一个匹配给定条件的元素
//FirstOrDefault()跟First()方法不同的一点是:无需添加错误处理代码,如果没有匹配的数据,也不会报错
var queryResult6 = from c in customers select new { c.City, c.Country, c.Region };
Console.WriteLine("A customer in Africa");
Console.WriteLine(queryResult6.First(c => c.Region == "Africa"));
Console.WriteLine("A customer in Antarctica");
Console.WriteLine(queryResult6.FirstOrDefault(c => c.Region == "Antarctica"));
//集运算符的使用
//初始化一个Order列表
List<Order> orders = new List<Order>{
new Order { ID="P", Amount=100 },
new Order { ID="Q", Amount=200 },
new Order { ID="R", Amount=300 },
new Order { ID="S", Amount=400 },
new Order { ID="T", Amount=500 },
new Order { ID="U", Amount=600 },
new Order { ID="V", Amount=700 },
new Order { ID="W", Amount=800 },
new Order { ID="X", Amount=900 },
new Order { ID="Y", Amount=1000 },
new Order { ID="Z", Amount=1100 }
};
var customerIDs = from c in customers select c.ID;
var orderIDs = from o in orders select o.ID;
//Intersect():两个集合的交集
var customersWithOrders = customerIDs.Intersect(orderIDs);
Console.WriteLine("Customers IDs with Orders:");
foreach (var item in customersWithOrders)
{
Console.Write("{0} ", item);
}
Console.WriteLine();
Console.WriteLine("Order IDs with no customers:");
//Except():取得在一个集合中存在在另一个集合中不存在的数据Order中存在,Customer中不存在的ID值
var ordersNoCustomers = orderIDs.Except(customerIDs);
foreach (var item in ordersNoCustomers)
{
Console.Write("{0} ", item);
}
Console.WriteLine();
Console.WriteLine("All Customer and Order IDs:");
//Union():两个集合的并集,没有重复
var allCustomerOrderIDs = orderIDs.Union(customerIDs);
foreach (var item in allCustomerOrderIDs)
{
Console.Write("{0} ", item);
}
Console.WriteLine();
//Join的用法
var queryJoinResult = from c in customers join o in orders on c.ID equals o.ID select new { c.ID, c.City, SalesBefore = c.Sales, NewOrders = o.Amount, SalesAfter = c.Sales + o.Amount };
foreach (var item in queryJoinResult)
{
Console.WriteLine(item);
}
Console.Write("Program finished,press Enter to return:");
Console.ReadLine();
}
/// <summary>
/// 测试string和int类型数组中使用Linq查询
/// </summary>
private static void StringIntTest()
{
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythes", "Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba", "Fatimah" };
//按照最后一个字母排序
//var queryResults = from n in names where n.StartsWith("S") orderby n.Substring(n.Length-1) select n;
var queryResults = names.OrderBy(n => n.Substring(n.Length - 1)).Where(n => n.StartsWith("S"));
Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults)
{
Console.WriteLine(item.ToString());
}
int[] numbers = generateLotsOfNumbers(12345678);
var quereNumbers = from n in numbers where n < 1000 select n;
Console.WriteLine("Numbers less than 1000:");
foreach (var item in quereNumbers)
{
Console.WriteLine(item);
}
var queryNumbers = from n in numbers where n > 1000 select n;
Console.WriteLine("Count of number>1000:");
Console.WriteLine(queryNumbers.Count());
Console.WriteLine("Max of number>1000:");
Console.WriteLine(queryNumbers.Max());
Console.WriteLine("Min of number>1000:");
Console.WriteLine(queryNumbers.Min());
Console.WriteLine("Average of number>1000:");
Console.WriteLine(queryNumbers.Average());
Console.WriteLine("Sum of number>1000:");
Console.WriteLine(queryNumbers.Sum(n => (long)n));
Console.Write("Program finished,press Enter to return:");
Console.ReadLine();
}
private static int[] generateLotsOfNumbers(int count)
{
Random generator = new Random(0);
int[] results = new int[count];
for (int i = 0; i < count; i++)
{
results[i] = generator.Next();
}
return results;
}