首页
学习
活动
专区
圈层
工具
发布

使用LINQ查询和更新集合中的属性

LINQ查询和更新集合中的属性

基础概念

LINQ (Language Integrated Query) 是.NET框架中的一组技术,它提供了强大的查询能力,可以直接在C#或VB.NET代码中编写查询表达式。LINQ可以用于查询和操作各种数据源,包括集合、数据库、XML等。

优势

  1. 强类型检查:编译时类型检查减少运行时错误
  2. 统一的查询语法:无论数据源是什么,查询语法基本一致
  3. 可读性强:接近自然语言的查询表达式
  4. 延迟执行:查询只在需要结果时才执行
  5. 集成度高:与.NET语言深度集成

常见LINQ操作类型

1. 查询操作

  • Where:筛选
  • Select:投影/转换
  • OrderBy/OrderByDescending:排序
  • GroupBy:分组
  • Join:连接
  • Distinct:去重

2. 更新操作

  • 通过Select创建新对象
  • 使用ForEach方法修改现有对象
  • 结合ToList()或ToArray()实现立即执行

应用场景

  1. 内存集合的数据筛选和处理
  2. 数据库查询(通过LINQ to SQL或Entity Framework)
  3. XML文档处理
  4. 并行数据处理(PLINQ)

示例代码

1. 基本查询示例

代码语言:txt
复制
// 定义示例类
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int Stock { get; set; }
}

// 创建示例集合
List<Product> products = new List<Product>
{
    new Product { Id = 1, Name = "Laptop", Price = 999.99m, Stock = 10 },
    new Product { Id = 2, Name = "Mouse", Price = 25.50m, Stock = 50 },
    new Product { Id = 3, Name = "Keyboard", Price = 45.00m, Stock = 30 }
};

// 查询价格大于50的产品
var expensiveProducts = products.Where(p => p.Price > 50);

// 查询产品名称和价格
var productNamesAndPrices = products.Select(p => new { p.Name, p.Price });

// 按库存排序
var orderedByStock = products.OrderBy(p => p.Stock);

2. 更新集合属性

代码语言:txt
复制
// 方法1: 使用Select创建新集合(不修改原集合)
var discountedProducts = products.Select(p => new Product
{
    Id = p.Id,
    Name = p.Name,
    Price = p.Price * 0.9m, // 打9折
    Stock = p.Stock
}).ToList();

// 方法2: 修改原集合中的对象
products.ForEach(p => p.Price *= 0.9m);

// 方法3: 使用LINQ查询后更新特定项
var lowStockProducts = products.Where(p => p.Stock < 20);
foreach (var product in lowStockProducts)
{
    product.Stock += 10; // 库存不足的补货10个
}

3. 复杂查询示例

代码语言:txt
复制
// 分组查询
var productsByStockLevel = products.GroupBy(p => 
    p.Stock < 20 ? "Low" : 
    p.Stock < 40 ? "Medium" : "High");

foreach (var group in productsByStockLevel)
{
    Console.WriteLine($"Stock Level: {group.Key}");
    foreach (var product in group)
    {
        Console.WriteLine($"  {product.Name} - {product.Stock}");
    }
}

// 连接查询(假设有另一个类别集合)
List<Category> categories = new List<Category>
{
    new Category { ProductId = 1, CategoryName = "Electronics" },
    new Category { ProductId = 2, CategoryName = "Accessories" },
    new Category { ProductId = 3, CategoryName = "Accessories" }
};

var productWithCategory = from p in products
                         join c in categories on p.Id equals c.ProductId
                         select new { p.Name, c.CategoryName };

常见问题及解决方案

问题1: 修改集合时出现异常

原因: 在foreach循环中直接修改集合会导致InvalidOperationException 解决方案: 使用ToList()先创建副本或使用ForEach方法

代码语言:txt
复制
// 错误方式
foreach (var item in collection) 
{
    collection.Remove(item); // 抛出异常
}

// 正确方式
foreach (var item in collection.ToList()) 
{
    collection.Remove(item); // 正常执行
}

问题2: 延迟执行导致意外结果

原因: LINQ查询默认延迟执行,查询定义后如果数据源变化会影响结果 解决方案: 使用ToList()或ToArray()立即执行查询

代码语言:txt
复制
var query = products.Where(p => p.Price > 100);
products.Add(new Product { Price = 200 }); // 会影响query的结果

// 确保结果不变
var result = products.Where(p => p.Price > 100).ToList();
products.Add(new Product { Price = 200 }); // 不会影响result

问题3: 性能问题

原因: 复杂的LINQ查询可能导致性能下降 解决方案:

  1. 简化查询逻辑
  2. 在数据库端使用LINQ to SQL或EF Core的查询
  3. 考虑使用PLINQ进行并行处理
代码语言:txt
复制
// 普通LINQ
var result = products.Where(p => p.Price > 100).ToList();

// 并行LINQ(PLINQ)
var parallelResult = products.AsParallel()
                           .Where(p => p.Price > 100)
                           .ToList();

LINQ提供了强大而灵活的方式来查询和操作集合数据,合理使用可以大大提高开发效率和代码可读性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券