当我们需要对一个集合进行转换时,可以使用C#中的LINQ(Language Integrated Query)语句来实现。其中,LINQ中的Select和SelectMany函数就是用来做数据集合转换的。
Select函数
函数介绍
Select函数可以将集合中的每个元素转换为新的类型或值,并返回一个新的集合。Select函数的返回值类型为IEnumerable
Select函数的方法签名如下:
public static IEnumerable<TResult> Select<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TResult> selector
);
其中,source参数是要进行转换的集合,selector参数则是对每个元素进行转换的委托。
委托使用示例
下面是一个例子,假设有以下的Student类:
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public double Score { get; set; }
}
我们可以使用Select函数,将一个Student集合中每个元素的Name属性提取出来,返回一个新的字符串集合:
List<Student> students = new List<Student>()
{
new Student { Name = "Tom", Age = 18, Score = 90 },
new Student { Name = "Jerry", Age = 19, Score = 75 },
new Student { Name = "Mike", Age = 20, Score = 85 },
new Student { Name = "Lucy", Age = 18, Score = 95 }
};
List<string> names = students.Select(s => s.Name).ToList();
Lambda表达式使用示例
上述例子中selector参数使用了Lambda表达式,可以使用Lambda表达式更加方便地编写Select函数。Lambda表达式的格式如下:
source => expression
其中,source表示要转换的元素,而expression则是对元素进行转换的表达式。
SelectMany函数
函数介绍
SelectMany函数可以将嵌套的集合展开成一维集合,并且对展开后的每个元素进行转换。最后会返回一个新的集合。SelectMany函数的返回值类型为IEnumerable
SelectMany函数的方法签名如下:
public static IEnumerable<TResult> SelectMany<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, IEnumerable<TResult>> selector
);
委托使用示例
下面是一个例子,假设有以下的Teacher和Student类:
public class Teacher
{
public string Name { get; set; }
public List<Student> Students { get; set; }
}
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public double Score { get; set; }
}
我们可以使用SelectMany函数,将一个包含多个Teacher对象的集合,展开成一个包含所有Student对象的一维集合,并返回一个新的Student集合:
List<Teacher> teachers = new List<Teacher>()
{
new Teacher
{
Name = "Teacher1",
Students = new List<Student>()
{
new Student { Name = "Tom", Age = 18, Score = 90 },
new Student { Name = "Jerry", Age = 19, Score = 75 }
}
},
new Teacher
{
Name = "Teacher2",
Students = new List<Student>()
{
new Student { Name = "Mike", Age = 20, Score = 85 },
new Student { Name = "Lucy", Age = 18, Score = 95 }
}
}
};
List<Student> students = teachers.SelectMany(t => t.Students).ToList();
结果集合中包含了所有的Student对象:
Tom, Jerry, Mike, Lucy
其中,第一步使用SelectMany函数将每个Teacher对象的Students属性展开成一个一维集合;
第二步再使用Select函数,将每个元素的Name属性提取出来转换成字符串。
List<string> names = teachers.SelectMany(t => t.Students).Select(s => s.Name).ToList();
结果集合中包含了所有Student的Name属性:
Tom, Jerry, Mike, Lucy
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中LINQ的Select与SelectMany函数使用 - Python技术站