• 用LINQ和Select 方法操作DataTable的优缺点对比
  • 发布于 1周前
  • 37 热度
    0 评论
在 C# 中,DataTable 是处理表格数据的常用类。我们可以使用多种方法查询数据,例如直接调用 Select 方法或利用 LINQ(Language Integrated Query)。不同的方法适用于不同场景,本文将详细讲解它们的用法和区别。
一、查询方式概览
查询方式 适用场景 优势 劣势
Select 方法 简单条件查询 性能较高,语法简单 可读性较差,灵活性有限
LINQ 查询 复杂条件或需要链式操作的查询 可读性高,支持强大的表达能力 性能略逊于 Select,内存占用略高

二、Select 方法查询
Select 方法适合简单条件的查询,通过传入字符串表达式来筛选数据。
示例:查询价格大于 100 的商品
using System.Data;

DataTable table = new DataTable();
// 初始化表结构
table.Columns.Add("ProductID", typeof(int));
table.Columns.Add("ProductName", typeof(string));
table.Columns.Add("Price", typeof(decimal));

// 添加数据
table.Rows.Add(1, "Laptop", 800);
table.Rows.Add(2, "Mouse", 25);
table.Rows.Add(3, "Keyboard", 120);
// 堆代码 duidaima.com
// 使用 Select 方法查询
DataRow[] rows = table.Select("Price > 100");

foreach (DataRow row in rows)
{
    Console.WriteLine($"ProductID: {row["ProductID"]}, ProductName: {row["ProductName"]}, Price: {row["Price"]}");
}
优缺点分析
优点: 简洁明了,适合简单条件查询。
缺点: 查询逻辑写在字符串中,缺乏编译期检查,容易出错。

三、LINQ 查询
LINQ 是一种集成语言查询工具,可以直接使用对象查询语法操作 DataTable,支持复杂的条件和链式操作。
关键概念
AsEnumerable(): 将 DataTable 转换为可枚举的 IEnumerable<DataRow>。
Field<T>(): 获取指定列的值,并安全地转换为指定类型。

示例:查询并排序价格大于 50 的商品
using System;
using System.Data;
using System.Linq;

DataTable table = new DataTable();
// 初始化表结构
table.Columns.Add("ProductID", typeof(int));
table.Columns.Add("ProductName", typeof(string));
table.Columns.Add("Price", typeof(decimal));

// 添加数据
table.Rows.Add(1, "Laptop", 800);
table.Rows.Add(2, "Mouse", 25);
table.Rows.Add(3, "Keyboard", 120);
table.Rows.Add(4, "Monitor", 300);

// 使用 LINQ 查询和排序
var query = table.AsEnumerable()
                 .Where(row => row.Field<decimal>("Price") > 50)
                 .OrderBy(row => row.Field<decimal>("Price"));

foreach (var row in query)
{
    Console.WriteLine($"ProductID: {row["ProductID"]}, ProductName: {row["ProductName"]}, Price: {row["Price"]}");
}
优缺点分析
优点: 代码可读性高,支持复杂条件和操作链。
缺点: 性能略逊于 Select 方法。

四、进阶 LINQ 操作
1. 筛选特定列
选择商品名称和价格:
var selectedColumns = table.AsEnumerable()
                           .Select(row => new
                           {
                               ProductName = row.Field<string>("ProductName"),
                               Price = row.Field<decimal>("Price")
                           });

foreach (var item in selectedColumns)
{
    Console.WriteLine($"ProductName: {item.ProductName}, Price: {item.Price}");
}
2. 聚合操作
计算商品的总价格:
var totalPrice = table.AsEnumerable()
                      .Sum(row => row.Field<decimal>("Price"));
Console.WriteLine($"Total Price: {totalPrice}");
3. 分组统计
按价格区间分组,统计每组商品数量:
var groupedByPriceRange = table.AsEnumerable()
                               .GroupBy(row => row.Field<decimal>("Price") > 500 ? "High" : "Low")
                               .Select(group => new
                               {
                                   Range = group.Key,
                                   Count = group.Count()
                               });

foreach (var group in groupedByPriceRange)
{
    Console.WriteLine($"Price Range: {group.Range}, Count: {group.Count}");
}
五、选择合适的方法
查询需求 推荐方式
简单条件查询 Select 方法
复杂逻辑或链式操作 LINQ 查询
高可读性和维护性 LINQ 查询
性能优先 Select 方法

六、结语
Select 方法: 简单、高效,但灵活性有限。
LINQ 查询: 支持复杂操作,代码更易读,但性能略逊。
根据需求权衡性能和可读性,选择适合的方法。
用户评论