public class TEST
{
/*
* 统计一个字符串每个字母出现的频率(忽略大小写),然后
* 按照从高到低的顺序输出出现频率高于2次的单词和其出现的频率
* LINQ的写法跟sql相似
* */
public static void FindLetterAppearOverTwoTimes()
{
string str = "abaacdlkjljo";
var items = str.Where(c => char.IsLetter(c))//过滤非字母
.Select(c => char.ToLower(c))//大写转小写
.GroupBy(c => c)//根据字母进行分组
.Where(g => g.Count() > 2)//过滤掉出现次数<=2
.OrderByDescending(g => g.Count())//按次数排序
.Select(g => new { Char = g.Key, Count = g.Count() });
foreach (var item in items)
{
Console.WriteLine(item);
}
}
/// <summary>
/// 让数组中大于10的数
/// </summary>
public static void FindNumsOver10()
{
int[] nums = new int[] { 3, 5, 8, 7, 9, 5, 4, 311, 54, 58 };
IEnumerable<int> targetNum = nums.Where(s => s > 10);
foreach (var item in targetNum)
{
Console.WriteLine(item);
}
}
#region 常见的扩展方法
private static List<Employee> empList = new List<Employee>()
{
new Employee (){Id=1001,Name="Jack",Age=10,Gender=true,Salary=5000},
new Employee (){Id=1002,Name="Jim",Age=20,Gender=false,Salary=800},
new Employee (){Id=1003,Name="Tom",Age=30,Gender=true,Salary=800},
new Employee (){Id=1004,Name="Jerry",Age=40,Gender=false,Salary=800},
new Employee (){Id=1005,Name="Nancy",Age=50,Gender=true,Salary=800},
new Employee (){Id=1006,Name="Lily",Age=60,Gender=true,Salary=8000},
};
public static void FindTargetByWhere()
{
IEnumerable<Employee> emp = empList.Where(e => e.Age > 30);
foreach (var item in emp)
{
Console.WriteLine(item);
}
Console.WriteLine("--------------");
Console.WriteLine(empList.Count());
Console.WriteLine(empList.Count(e => e.Age > 20));
Console.WriteLine(emp.Any(e => e.Salary > 3000));
}
/// <summary>
/// Single 有且只有一条
/// SingleOrDefault最多一条满足要求的数据
/// Frist 至少有一条,返回第一条
/// FirstOrDefault 返回第一条或者默认值;
/// </summary>
public static void GetSingleResult()
{
IEnumerable<Employee> item = empList.Where(e => e.Name == "Jerry");
Employee e = item.Single();
Employee e2 = empList.Single(e => e.Name == "Jerry");
Employee e3 = empList.SingleOrDefault(e => e.Name == "Jeer");
Employee e4 = empList.First(e => e.Age != 11);
Employee e5 = empList.FirstOrDefault(e => e.Age > 20);
Console.WriteLine(e3);
Console.WriteLine(e4);
Console.WriteLine(e5);
}
/// <summary>
/// Order by的用法
/// </summary>
public static void LinqOrderby()
{
IEnumerable<Employee> item2 = empList.OrderBy(e => e.Age);
foreach (var item in item2)
{
Console.WriteLine("正序");
Console.WriteLine(item);
}
IEnumerable<Employee> item3 = empList.OrderByDescending(e => e.Age);
foreach (var item in item3)
{
Console.WriteLine("倒序");
Console.WriteLine(item);
}
}
/// <summary>
/// skip和take的用法
/// </summary>
public static void LinqSkipTake()
{
var items = empList.Skip(3).Take(2);
foreach (var item in items)
{
Console.WriteLine(item);
}
}
/// <summary>
/// 聚合函数的使用
/// </summary>
public static void LinqGROUP()
{
int a = empList.Max(e => e.Age);
Console.WriteLine(a);
double a2 = empList.Where(e => e.Salary > 0).Average(e => e.Age);
Console.WriteLine(a2);
var items = empList.GroupBy(e => e.Age);
foreach (var item in items)
{
Console.WriteLine(item);
foreach (var e in item)
{
Console.WriteLine(e);
}
}
}
/// <summary>
/// 投影的使用
/// </summary>
public static void LinqWithProjection()
{
IEnumerable<string> item1 = empList.Where(e => e.Age > 30).Select(e => e.Name);
foreach (string s in item1)
{
Console.WriteLine(s);
}
IEnumerable<DOG> dogs = empList.Where(e => e.Age > 30).Select( e=>new DOG() { Id=e.Id,NickName=e.Name});
foreach (var s in dogs)
{
Console.WriteLine(s);
}
}
/// <summary>
/// Linq和匿名方法
/// </summary>
public static void LinqWithanonymity()
{
///匿名类型
var obj = new { Name = "aaa", Id = 10100, Url = "http://www.baidu.com" };
Console.WriteLine(obj.Name + obj.Id + obj.Url);
var item2 = empList.Where(e => e.Age > 20).Select(e => new
{
Name = e.Name,
Id = e.Id
});
foreach (var item in item2)
{
DOG dog = new DOG() { Id = item.Id, NickName = item.Name };
Console.WriteLine(dog);
}
var item3 = empList.ToLookup(e => e.Age);
}
public static void LINQWithChainCall()
{
var items = empList.Where(e => e.Id > 2).GroupBy(e => e.Age).OrderBy(g => g.Key).
Take(3)//g=IGrouping(int,Employee)
.Select(g => new { NL = g.Key, RS = g.Count(), PJ = g.Average(e => e.Salary) });
foreach (var item in items)
{
Console.WriteLine(item.NL +" " +item.RS + " " +item.PJ);
}
}
#endregion
}