提示:如有错误,请不吝指出
注意:
var customers = new[]
{
new {CustomerID=1,FirstName="Kinm",LastName="AberCrim",CompanyName="Alpine"},
new {CustomerID=2,FirstName="Jeff",LastName="Hay",CompanyName="Coho"},
new {CustomerID=3,FirstName="Charlie",LastName="Herb",CompanyName="House"}
};
var address = new[] {
new {CompanyName="Alpine",City="Berne",Country="Land"},
new {CompanyName="A",City="B",Country="Land"},
new {CompanyName="Coho",City="San",Country="US"},
new {CompanyName="Trey",City="Microsoft",Country="London"}
};
Select其实是IEnumerable类的扩展方法,IEnumerable类System.Linq命名空间;在该命名空间中可以查看Enumerable.Select方法定义
IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName);
// 后面的同理,使用foreach遍历可枚举集合
foreach (string name in customerFirstNames)
{
Console.WriteLine(name);
}
方法1:将名字和姓氏连接成单个字符串
IEnumerable<string> customerName=customers.Select(cust => $"{cust.FirstName} {cust.LastName}");
方法2:定义新类型来封装多个数据项,并用Select方法构造该类型的实例
IEnumerable<FullName> customerFullNames = customers.Select(cust => new FullName { FirstName = cust.FirstName, LastName = cust.LastName });
//class FullName
//{
// public string FirstName { get; set; }
//public string LastName { get; set; }
//}
方法3:使用匿名数组以及var
var customerFullName = customers.Select(data => new { FirstName = data.FirstName, LastName = data.LastName });
// 筛选数据
// 要正确理解方法的应用顺序
// 先应用where方法,筛选出符合条件的行;再应用Select方法,从而指定其中特定的字段
#region 筛选数据
Console.WriteLine("====================================================================================");
IEnumerable<string> usCompanies = address
.Where(addr => string.Equals(addr.Country, "London"))
.Select(usComp => usComp.CompanyName);
foreach (string name in usCompanies)
{
Console.WriteLine(name);
}
#endregion
#region 排序、分组、聚合数据
// 使用OrderBy方法:按特定顺序获取数据(升序)
// OrderByDescending方法(降序)
// 按多个键来排序,在OrderBy方法或OrderByDescending方法之后使用ThenBy或ThenbyDescending方法
IEnumerable<string> companyNames = address.OrderBy(addr => addr.CompanyName).Select(comp => comp.CompanyName);
foreach (string name in companyNames)
{
Console.WriteLine(name);
}
Console.WriteLine();
// 使用GroupBy方法:按一个或多个字段中共同的值对数据进行分组(本例按国家对数组中的公司进行分组)
var CompaniesGroupByCountry=address.GroupBy(addrs => addrs.Country); // 返回可枚举集合中 的 所有行 都依据该方法所指定的字段进行分组(多行数据)
foreach (var companiesPerCountry in CompaniesGroupByCountry) // 逐行遍历
{
// Key字段访问作为分组依据的值,Count为数目 Max Min等
Console.WriteLine($"Country:{companiesPerCountry.Key}\t{companiesPerCountry.Count()}");
foreach (var companies in companiesPerCountry) // 遍历当前行的所有数据
{
Console.WriteLine($"\t{companies.CompanyName}");
}
}
// 注意,该汇总方法不会区分包含相同值的字段
int numberOfCompanies=address.Select(addr => addr.CompanyName).Count();
Console.WriteLine($"Number of companies:{numberOfCompanies}");
// 使用Distinct方法删除重复
int numberOfDistinctCountries = address.Select(addr => addr.Country).Distinct().Count();
Console.WriteLine($"Number of distinct countries: {numberOfDistinctCountries}");
#endregion
#region Join方法联接数据
// 两个数组的匹配键是CompanyName,Select方法指定customers数组中感兴趣的字段(FirstName,LastName),以及指定了作为匹配键使用的字段CompanyName
// 然后使用Join方法将Select标识的数据同另一个可枚举集合联接起来
// Join方法的参数:
// 1.要连接的目标可枚举集合
// 2.一个对 Select方法标识数据 中的匹配键字段进行标识的方法
// 3.一个对 目标集合 中的匹配键字段进行标识的方法
// 4.一个对 Join方法返回的结果集合 中的 列 进行了标识的方法
var companiesAndCustomers = customers
.Select(c => new { c.FirstName, c.LastName, c.CompanyName })
.Join(address, custs => custs.CompanyName, addrs => addrs.CompanyName,
(custs, addrs) => new { custs.FirstName, custs.LastName, addrs.Country });
foreach (var row in companiesAndCustomers)
{
Console.WriteLine(row);
}
// 本例通过Join方法将两个数组联接起来,联接依据就是两个数组中的CompanyName字段值匹配,结果集合包含customers数组的FirstName字段和LastName字段以及address数组中的Country字段
#endregion
#region 使用查询操作符 这种方法为上述查询方法的简写,便于开发
// 获取每个客户的名字
var customersName=from cust in customers select cust.FirstName;
//Select(cust=>cust):返回整行,而不是特定的列
//var customersName1 = from cust in customers select cust;
//foreach (var item in customersName1)
//{
// Console.WriteLine(item);
//}
// 获取每个客户的名字和姓氏
var customerNames=from a in customers select new {a.FirstName,a.LastName};
// 筛选数据用where (需要注意的是,在这里筛选出来的数据为集合,需要使用循环遍历输出)
var usCompanies2 = from b in address where String.Equals(b.Country, "London") select b.CompanyName;
// 数据排序用orderby (根据CompanyName字段进行排序,然后获取排序后的CompanyName字段)
var companyNames2=from a in address orderby a.CompanyName select a.CompanyName;
// 数据分组用group
// 可以使用和以前一样的循环遍历结果
var companiesGroupedByCountry = from a in address group a by a.Country;
// Count方法
int number1=(from a in address select a.CompanyName).Count();
// Distinct方法 忽略重复值
int number2=(from a in address select a.Country).Distinct().Count();
// 统计集合中的行数
int sumRows = address.Count();
// Join操作符根据一个匹配键来联接两个集合 on和equals操作符指定两个集合如何关联 注意equals左边为“源”右边为“目标”
// 当返回两个及以上数据的时候,使用new{}来进行返回
var citiesAndCustomers = from a in address join c in customers on a.CompanyName equals c.CompanyName select new { c.FirstName, c.LastName, a.Country };
#endregion