using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace @try
{
public class person
{
public person() { }
public string Name { get; set; }
public int ID { get; set; }
public int MajorID { get; set; }
public person(int id, string name, int majorID,Major[] mlist)
{
Name = name; ID = id; MajorID = majorID;majorlist = mlist;
}
public Major[] majorlist {get;set; }
}
public class Major
{
public Major(int majorid, string majorname)
{
this.MajorID = majorid;
this.MajorName = majorname;
}
public int MajorID { get; set; }
public string MajorName { get; set; }
}
class Program
{
static void Main(string[] args)
{
//LINQ
//获取数据源
List<person> people = new List<person> {
new person(1, "P1",101,new Major[]
{
new Major(105, "major11"),
new Major(106, "major12"),
new Major(107, "major13"),
}),
new person(2, "P2",102,new Major[]
{
new Major(108, "major15"),
new Major(109, "major16"),
}),
new person(3, "P3",101,
new Major[]
{
new Major(110, "major17"),
new Major(111, "major18"),
}),
};
List<Major> majors = new List<Major>
{
new Major(100,"VC"),
new Major(101,"VC++"),
new Major(102,"C#")
};
//1.select where单表查询
var name_ID = from p in people
where p.ID > 0
orderby p.ID
ascending
select new { p.ID, p.Name };
foreach (var item in name_ID)
{
Console.WriteLine($"{item.ID},{item.Name}");
}
//Console.ReadKey();
//2.from select where联合查询
var name_Major = from p in people
from m in majors
where p.MajorID == m.MajorID
orderby p.ID
ascending
select new { name = p.Name,major_name = m.MajorName };
foreach (var item in name_Major)
{
Console.WriteLine($"{item.name},{item.major_name}");
}
Console.ReadKey();
//3.join...on...联合查询
var Name_Major = from p in people
join m in majors on p.MajorID equals m.MajorID
where m.MajorID > 0
where p.ID > 1
select new { p.ID, p.Name, m.MajorName };
foreach (var item in Name_Major)
{
Console.WriteLine($"{item.ID},{item.Name},{item.MajorName}");
}
//Console.ReadKey();
//join扩展方法
var lst_person_major = people.Join(majors, p => p.MajorID, m => m.MajorID, (p, m) => new { p.ID, p.Name, p.MajorID, m.MajorName });
//4.select扩展方法的函数重载
//4.1 public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
var namelist = people.Select(p => new { p.ID, p.Name });
//4.2 public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector);
//TSource是源集合的元素
//index是源集合元素对应的下标
var index_name = people.Select((p, indexer) => new { indexer, p.Name });
//5.扩展方法SelectMany查询
//SelectMany函数重载
//SelectMany的作用就是:将people集合对象的每个元素(每个Person实例对象,如名为“P1”,“P2”,“P3”)
//映射到每个Person类对应的majorlist集合的每个元素(如名为“P1”对应majorlist的元素major11,major22,major33),
//并将每个Person对象对应的所有majorlist集合的每个元素重新组合成一个集合.
//5.1 public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector);
var majorarray_put_LINQ = people.SelectMany(p => p.majorlist);
foreach (var item in majorarray_put_LINQ)
{
Console.WriteLine($"{item.MajorID},{item.MajorName}");
}
//5.2 public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector);
var majorarray_put_LINQ_index = people.SelectMany((p, indexer) =>
p.majorlist.Select(m =>
{
m.MajorName = indexer + "," + m.MajorName;
return new { m.MajorID, m.MajorName };
})
);
//5.3 public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);
var majorarray_put_LINQ_index_all = people.SelectMany(
(p, index) => p.majorlist.Select(m => {
m.MajorName = index + "," + m.MajorName;
return new { m.MajorID, m.MajorName };
}),
(p,m)=>new { p.Name,m.MajorID,m.MajorName});
Console.WriteLine("\r\n\r\n");
//5.4 public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);
var majorarray_put_LINQ_All = people.SelectMany(p => p.majorlist, (p, m) => new { p.ID, p.Name, m.MajorID, m.MajorName });
//以上语句等效如下
var majorarray_put_from_all = from p in people
from mj in p.majorlist
select new {p.ID, p.Name, mj.MajorID, mj.MajorName };
foreach (var item in majorarray_put_LINQ_All)
{
Console.WriteLine($"{item.ID},{item.Name},{item.MajorID},{item.MajorName}");
}
Console.ReadKey();
}
}
LINQ:IEnumrable<T>的扩展方法Select/SelectMany函数重载demo
于 2024-05-09 14:06:52 首次发布