C# Linq用法

Linq知识点

C# LINQ(Language-Integrated Query)是一种用于.NET平台的查询技术,它提供了一种简单、直观的方式来查询数据。学习C# LINQ的步骤如下:

掌握C#编程语言的基础知识,包括变量、数组、方法、类等概念。

1.学习LINQ的基础概念,包括LINQ查询表达式、LINQ方法语法、LINQ to SQL等。

2.熟悉LINQ查询表达式和方法语法的使用,学习LINQ查询语句的基本结构、查询操作符和查询结果类型。

3.学习如何使用LINQ to SQL进行数据库查询,包括如何创建数据上下文、如何查询数据、如何进行分组和聚合等操作。

4.练习编写LINQ查询语句,加深对LINQ的理解,并掌握如何使用LINQ进行数据处理和查询。


Linq操作数组

以下是一个简单的示例,使用LINQ查询一个整数数组中的偶数:

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evenNumbers = from num in numbers
                  where num % 2 == 0
                  select num;
foreach (var num in evenNumbers)
{
    Console.WriteLine(num);
}

以上代码定义了一个整数数组numbers,使用LINQ查询语句from num in numbers where num % 2 == 0 select num筛选出其中的偶数,并将结果存储在一个变量evenNumbers中。最后,使用foreach循环输出筛选出的偶数。


还有一种方法语法的实现:

var evenNumbers = numbers.Where(num => num % 2 == 0);
foreach (var num in evenNumbers)
{
    Console.WriteLine(num);
}

使用方法语法时,可以使用Where方法筛选出偶数,与查询语法的结果相同。


Linq操作集合

C# LINQ可以用于对各种数据源进行查询和操作,其中包括集合。以下是一些常见的LINQ操作集合的示例:

Linq查询

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 使用查询语法查询偶数
var evenNumbers = from num in numbers
                  where num % 2 == 0
                  select num;
// 使用方法语法查询奇数
var oddNumbers = numbers.Where(num => num % 2 != 0);
foreach (var num in evenNumbers)
{
    Console.WriteLine(num);
}
foreach (var num in oddNumbers)
{
    Console.WriteLine(num);
}

Linq聚合

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 求和
int sum = numbers.Sum();
// 求最大值
int max = numbers.Max();
// 求平均值
double average = numbers.Average();
Console.WriteLine(sum);     // 输出55
Console.WriteLine(max);     // 输出10
Console.WriteLine(average); // 输出5.5

Linq排序

List<string> names = new List<string> { "Tom", "Jerry", "Alice", "Bob" };
// 使用查询语法按字母顺序排序
var sortedNames = from name in names
                  orderby name
                  select name;
// 使用方法语法按字符串长度排序
var sortedNamesByLength = names.OrderBy(name => name.Length);
foreach (var name in sortedNames)
{
    Console.WriteLine(name);
}
foreach (var name in sortedNamesByLength)
{
    Console.WriteLine(name);
}

以上是一些常见的LINQ操作集合的示例,还有许多其他的操作可以使用LINQ进行集合的操作和处理。


Linq类型转换1

适用于简单类型转换

List<object> names = new List<object> { "Tom", "Jerry", "Alice", "Bob" };
List<string> nameStrings=names.Cast<string>().ToList();


Linq类型转换2

List<object> names = new List<object> { "Tom", "Jerry", "Alice", "Bob" };
var list=names.Select(it=>new {
   length=it.Length,
   name=it
}).ToList();//Select可以返回任意类型


Linq分组

这将根据 myList 列表中的 Category 属性对其进行分组,并选择每个组的第一条记录。 result 变量将包含每个组的第一条记录。

var result = myList.GroupBy(x => x.Category)
                  .Select(g => g.OrderBy(x => x.Date).First());

每组取2条可以这样

var result = myList.GroupBy(x => x.Category)
                  .SelectMany(g => g.Take(2));
                  
 //SelectMany是将多个List合并成一个List<T>,而Select只能变成 List<List<T>>


Linq2个集合关联取数据

在 LINQ 中,可以使用 join 操作符将两个对象关联起来,然后进行相应的处理。假设有两个对象:Person 和 Address,Person 包含一个地址属性,如下所示:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int AddressId { get; set; }
    public Address Address { get; set; }
}
public  class Address
{
    public int Id { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
}

可以使用 join 操作符将这两个对象关联起来:

var query = from person in people
            join address in addresses on person.AddressId equals address.Id
            select new { person.Name, address.City, address.State };

在这个例子中,我们通过 AddressId 属性将 Person 和 Address 对象关联起来,并选择了 Person 的 Name 属性以及 Address 的 City 和 State 属性。这个查询将返回一个匿名类型的集合,其中包含每个人的名字、城市和州。


除了 join 操作符,还可以使用其他的 LINQ 操作符来处理两个对象之间的关联,例如:GroupJoin、SelectMany、Zip 等等。具体使用哪种操作符取决于需要解决的问题和数据的结构。


果糖网