Linq小例子

C#与LINQ应用实例
本文通过一个具体的C#程序实例介绍了如何使用LINQ进行数据筛选和排序操作,并展示了对象初始化器及ToString方法的使用。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Test t1 = new Test { ID = 23, Age = 23, Name = "测试" };
            rtbx.AppendText(t1+"/r/n");

            //直接输入类别,隐匿调用t1的ToString()方法。
            List<Test> list = new List<Test>
            {
                new Test{ID=1,Age=10,Name="One"},
                new Test(){ID=2,Age=20,Name="Two"},
                new Test(){ID=3,Age=30,Name="Three"},
                new Test(){ID=4,Age=40,Name="Four"}
            };
            //var items = from t in list
            //            where t.Age > 15
            //            orderby t.ID descending
            //            select new{编号=t.ID,姓名=t.Name,年龄=t.Age};

 

            var items = list.Where(n => n.Age > 15).OrderByDescending(x => x.ID).Select(y => new { 编号 = y.ID, 姓名 = y.Name, 年龄 = y.Age });

 

         //在查询语法中需要select子句,但在以前并没有看到Select()方法,因为在LINQ方法语法中不需要它,除非在进行投射(改变结果集中所查询的原始类型)。

            foreach (var i in items)
            {
                rtbx.AppendText(i+"/r/n");
            }
       }
    }

    public class Test
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }

        public override string ToString()
        {
            return "ID:" + ID + " Name:" + Name + " Age:" + Age;
        }
    }

<think>我们正在处理一个关于在C#中使用LINQ操作DataTable的查询。根据提供的引用,特别是引用[2]和引用[4],我们有一些示例代码片段。引用[2]展示了使用Where子句和Containes方法(注意:这里可能有拼写错误,应为Contains)来筛选DataTable中的行,并遍历结果。引用[4]展示了一个类似SQL的查询语法,用于选择满足条件的行的特定列。此外,引用[3]提供了一个读取CSV文件到DataTable的示例,这可能有助于我们构建一个完整的示例,因为通常我们需要先有一个DataTable才能进行LINQ查询。需要注意的是,LINQ查询要求DataTable的Rows集合需要被转换为可枚举的类型,并且我们可以使用Field<T>扩展方法来访问列的值。我们将提供以下内容:1.一个完整的示例,包括创建或加载DataTable(为了示例,我们可能使用一个简单的内建DataTable)。2.使用两种LINQ查询方式:类似SQL的查询语法和方法语法。3.遍历查询结果。注意:引用[2]中的代码是直接对DataTable使用Where,但实际上,我们需要使用AsEnumerable()来将DataTable转换为IEnumerable<DataRow>,这样LINQ才能使用。因此,我们将展示:-一个示例DataTable的创建(包含几列,例如CustomerID,CustomerName,Country等)。-使用查询语法的LINQ示例(如引用[4])。-使用方法语法的LINQ示例(如引用[2])。我们也会注意,LINQtoDataSet需要引用System.Data.DataSetExtensions和System.Linq。下面是一个完整的示例代码:</think> ### C#中使用LINQ操作DataTable的示例代码 以下是使用LINQ操作DataTable的三种常见方式,结合了**查询语法**和**方法语法**: #### 1. 基本查询(查询语法) ```csharp // 创建示例DataTable DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Country", typeof(string)); dt.Rows.Add(1, "John Smith", "USA"); dt.Rows.Add(2, "Maria Garcia", "Spain"); dt.Rows.Add(3, "John Doe", "Canada"); // LINQ查询:查找所有美国客户(查询语法) var query = from row in dt.AsEnumerable() where row.Field<string>("Country") == "USA" select row.Field<string>("Name"); foreach (string name in query) { Console.WriteLine(name); // 输出:John Smith } ``` #### 2. 条件筛选(方法语法) ```csharp // 查找包含"John"的客户(方法语法)[^2] var johnCustomers = dt.AsEnumerable() .Where(row => row.Field<string>("Name").Contains("John")) .Select(row => new { ID = row.Field<int>("ID"), FullName = row.Field<string>("Name") }); foreach (var cust in johnCustomers) { Console.WriteLine($"ID:{cust.ID}, Name:{cust.FullName}"); // 输出: // ID:1, Name:John Smith // ID:3, Name:John Doe } ``` #### 3. 多表连接查询 ```csharp // 创建订单表 DataTable orders = new DataTable(); orders.Columns.Add("OrderID", typeof(int)); orders.Columns.Add("CustomerID", typeof(int)); orders.Columns.Add("Amount", typeof(decimal)); orders.Rows.Add(101, 1, 199.99m); orders.Rows.Add(102, 3, 299.50m); // 连接客户表和订单表 var joinQuery = from cust in dt.AsEnumerable() join ord in orders.AsEnumerable() on cust.Field<int>("ID") equals ord.Field<int>("CustomerID") select new { OrderID = ord.Field<int>("OrderID"), CustomerName = cust.Field<string>("Name"), Amount = ord.Field<decimal>("Amount") }; foreach (var item in joinQuery) { Console.WriteLine($"{item.OrderID}: {item.CustomerName} - ${item.Amount}"); // 输出: // 101: John Smith - $199.99 // 102: John Doe - $299.50 } ``` ### 关键要点: 1. **`AsEnumerable()`转换**:必须先将DataTable转换为`IEnumerable<DataRow>`才能使用LINQ 2. **`Field<T>()`方法**:类型安全的列值访问(替代row["列名"]语法) 3. **延迟执行**:LINQ查询实际执行发生在第一次迭代时[^1] 4. **匿名类型**:可使用`select new {...}`创建临时结果对象 5. **关联数据**:可无缝连接多个DataTable实现类SQL的JOIN操作 > 注:使用前需添加命名空间: > ```csharp > using System.Data; > using System.Linq; > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值