linq查询的模拟

本文介绍了一个使用C#模拟LINQ查询的过程,通过自定义方法MyWhere实现类似LINQ的筛选功能,对数组或列表进行条件过滤,并展示了如何查找水仙花数的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _15linq查询的模拟
{
    public delegate bool CheckDelegate(int num);

    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = { 11, 12, 31, 10, 59, 13, 56, 45, -1, 49 };
           
            //foreach (int item in nums.Where(e => e % 2 == 0))
            //{
            //    Console.WriteLine(item);
            //}


            //int[] n = MyWhere(nums, e => e % 2 == 0);


            List<int> list = new List<int>();
            for (int i = 100; i < 1000; i++)
            {
                list.Add(i);
            }


            int[] ns = MyWhere(list.ToArray(),e=>
            {
                // 123
                int n1 = e % 10; // 3
                int n2 = e / 10 % 10; // 2
                int n3 = e / 100; // 1

                return (n1 * n1 * n1 + n2 * n2 * n2 + n3 * n3 * n3) == e;
                  
            });

            Console.WriteLine("开始打印:");
            foreach (int item in ns)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("打印结束!");

            Console.ReadKey();
        }


        public static int[] MyWhere(int[] nums, CheckDelegate ck)
        {
            List<int> list = new List<int>();
            for (int i = 0; i < nums.Length; i++)
            {
                if (ck(nums[i]))
                {
                    list.Add(nums[i]);
                }
            }
            return list.ToArray();
        }
    }
}


### C# 中使用 LINQ 进行多表联结查询 在 C# 的 LINQ 查询中,`join` 子句用于实现多个集合之间的关联操作。这种功能类似于 SQL 中的 `JOIN` 操作,允许开发者通过指定键来匹配不同数据源中的记录并生成新的结果集[^3]。 下面是一个完整的示例,展示如何利用 LINQ 执行多表联结查询: #### 示例代码 假设我们有两个列表分别表示学生和课程成绩的数据结构如下: ```csharp class Student { public int Id { get; set; } public string Name { get; set; } } class Grade { public int StudentId { get; set; } public string Subject { get; set; } public double Score { get; set; } } ``` 以下是具体的 LINQ 联结查询代码: ```csharp using System; using System.Collections.Generic; using System.Linq; public class Program { public static void Main() { List<Student> students = new List<Student> { new Student { Id = 1, Name = "Alice" }, new Student { Id = 2, Name = "Bob" }, new Student { Id = 3, Name = "Charlie" } }; List<Grade> grades = new List<Grade> { new Grade { StudentId = 1, Subject = "Math", Score = 90 }, new Grade { StudentId = 1, Subject = "English", Score = 85 }, new Grade { StudentId = 2, Subject = "Math", Score = 75 }, new Grade { StudentId = 3, Subject = "English", Score = 88 } }; // 使用 join 关键字进行联结查询 var queryResult = from student in students join grade in grades on student.Id equals grade.StudentId select new { StudentName = student.Name, Subject = grade.Subject, Score = grade.Score }; foreach (var item in queryResult) { Console.WriteLine($"Student: {item.StudentName}, Subject: {item.Subject}, Score: {item.Score}"); } } } ``` 此代码片段展示了如何将两个不同的集合(students 和 grades)基于共同的关键字段(student.Id 和 grade.StudentId)进行联结,并生成一个新的匿名对象集合,其中包含了学生的姓名、科目以及分数信息。 如果需要更复杂的联结条件或者处理左外连接等情况,则可以通过引入额外的方法调用来完成。例如,在某些情况下可能需要用到 `GroupJoin` 方法来模拟 SQL 中的 LEFT JOIN 行为。 #### 左外连接示例 对于左外连接的情况,可以采用以下方式实现: ```csharp var leftOuterJoinQuery = from student in students join grade in grades on student.Id equals grade.StudentId into gj from subgrade in gj.DefaultIfEmpty() select new { StudentName = student.Name, Subject = subgrade?.Subject ?? "No Grades", Score = subgrade?.Score ?? 0.0 }; ``` 在此例子中,当某个学生没有任何对应的评分记录时,默认会显示 `"No Grades"` 及零分作为占位符。 --- ### 总结 以上介绍了基本的 LINQ 多表联结查询及其扩展形式——左外连接的操作方法。这些技术能够帮助开发人员高效地处理来自不同数据源的信息,并将其整合到单一的结果集中以便进一步分析或呈现给最终用户[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值