LINQ (Language Integrated Query) 是.NET框架中的一组技术,它提供了强大的查询能力,可以直接在C#或VB.NET代码中编写查询表达式。LINQ可以用于查询和操作各种数据源,包括集合、数据库、XML等。
// 定义示例类
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);
// 方法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个
}
// 分组查询
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 };
原因: 在foreach循环中直接修改集合会导致InvalidOperationException 解决方案: 使用ToList()先创建副本或使用ForEach方法
// 错误方式
foreach (var item in collection)
{
collection.Remove(item); // 抛出异常
}
// 正确方式
foreach (var item in collection.ToList())
{
collection.Remove(item); // 正常执行
}
原因: LINQ查询默认延迟执行,查询定义后如果数据源变化会影响结果 解决方案: 使用ToList()或ToArray()立即执行查询
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
原因: 复杂的LINQ查询可能导致性能下降 解决方案:
// 普通LINQ
var result = products.Where(p => p.Price > 100).ToList();
// 并行LINQ(PLINQ)
var parallelResult = products.AsParallel()
.Where(p => p.Price > 100)
.ToList();
LINQ提供了强大而灵活的方式来查询和操作集合数据,合理使用可以大大提高开发效率和代码可读性。
没有搜到相关的文章