Linq表达式中Inner join(内链接)和left join、right join 的区别

废话不多说直接上代码演示:

接下来,定义 OrderCustomer 类,以及一些示例数据

using System;
using System.Linq;
using System.Collections.Generic;

class Order
{
    public int OrderId { get; set; }
    public string OrderName { get; set; }
    public int CustomerId { get; set; }
}

class Customer
{
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
}
//创建两个表 用CustomerId 为关联条件
var orders = new List<Order>
{
    new Order { OrderId = 1, OrderName = "Ordername 1", CustomerId = 1001 },
    new Order { OrderId = 2, OrderName = "Ordername 2", CustomerId = 1002 },
    new Order { OrderId = 3, OrderName = "Ordername 3", CustomerId = 1003 },
};

var customers = new List<Customer>
{
    new Customer { CustomerId = 1001, CustomerName = "Alice" },
    new Customer { CustomerId = 1003, CustomerName = "Bob" },
};

内连接示例

var innerJoinQuery =
    from order in orders
    join customer in customers
    on order.CustomerId equals customer.CustomerId
    select new
    {
        OrderName = order.OrderName,
        CustomerName = customer.CustomerName
    };

Console.WriteLine("Inner Join Results:");
foreach (var result in innerJoinQuery)
{
    Console.WriteLine($"Order: {result.OrderName}, Customer: {result.CustomerName}");
}

上述代码将执行内连接操作,只返回匹配的数据。结果只包括 orderscustomers 中具有相同 CustomerId 的行。

左连接示例:

var leftJoinQuery =
    from order in orders
    join customer in customers
    on order.CustomerId equals customer.CustomerId into customerGroup
    from customer in customerGroup.DefaultIfEmpty()
    select new
    {
        OrderName = order.OrderName,
        CustomerName = (customer != null) ? customer.CustomerName : "N/A"
    };

Console.WriteLine("\nLeft Join Results:");
foreach (var result in leftJoinQuery)
{
    Console.WriteLine($"Order: {result.OrderName}, Customer: {result.CustomerName}");
}

上述代码将执行左连接操作,返回了 orders 表的所有行,以及与之匹配的 customers 行(如果有匹配的话)。如果没有匹配的话,CustomerName 将标记为 "N/A"。

右连接示例:

var rightJoinQuery =
    from customer in customers
    join order in orders
    on customer.CustomerId equals order.CustomerId into orderGroup
    from order in orderGroup.DefaultIfEmpty()
    select new
    {
        CustomerName = customer.CustomerName,
        OrderName = (order != null) ? order.OrderName : "N/A"
    };

Console.WriteLine("Right Join Results:");
foreach (var result in rightJoinQuery)
{
    Console.WriteLine($"Customer: {result.CustomerName}, Order: {result.OrderName}");
}

上述代码模拟了 right join 操作,返回了 customers 表的所有行,以及与之匹配的 orders 行(如果有匹配的话)。如果没有匹配的话,OrderName 将标记为 "N/A"。

### YOLO算法常见面试问题及解决方案 #### 1. YOLO的核心思想是什么? YOLO(You Only Look Once)是一种端到端的目标检测框架,其核心思想是将目标检测视为回归问题。通过单次前向传播完成边界框预测和类别概率估计,从而实现了高效的目标检测[^2]。 #### 2. YOLOv4的改进方法有哪些分类? YOLOv4的改进方法主要分为两类: - **Bag of Freebies (BoF)**:这些技术仅在训练过程中应用,不会增加推理阶段的时间开销。例如数据增强、损失函数调整等[^1]。 - **Bag of Specials (BoS)**:这些技术会在模型中引入额外的模块或操作,虽然会略微增加推理成本,但能够显著提升检测精度。例如CBAM注意力机制、DropBlock正则化等。 #### 3. 如何解决数据量不足的问题? 当面临数据集较小的情况时,可以通过以下方式缓解domain shift带来的负面影响: - 使用迁移学习,利用预训练权重初始化网络参数。 - 应用数据增强技术,如随机裁剪、翻转、颜色抖动等。 - 尝试合成数据生成工具来扩充数据集[^4]。 #### 4. ROI Pooling 和 ROI Align 的区别是什么? ROI Pooling 是一种用于提取固定大小特征图的技术,在 Faster R-CNN 中被广泛使用。然而,由于量化过程的存在,可能会导致位置信息丢失。而 ROI Align 则摒弃了粗暴的量化操作,改用双线性插值获取精确坐标上的特征值,因此保留了更丰富的细节信息。 #### 5. K-means 聚类在 YOLO 中的作用是什么? 为了优化先验框的设计,YOLov2 提出了基于 k-means 聚类的方法来生成锚框尺寸。具体做法如下: - 对标注好的真实边界框宽高进行聚类分析。 - 计算每组样本与其对应簇心之间的距离度量(通常采用 IOU 表达的距离定义)。 - 不断更新各簇中心直至收敛得到最优解集合[^5]。 ```python import numpy as np def iou_distance(box, centroid): """计算box与centroid间的IOU距离""" intersection_width = min(box[0], centroid[0]) * 2 intersection_height = min(box[1], centroid[1]) * 2 if intersection_width < 0 or intersection_height < 0: return float('inf') intersection_area = intersection_width * intersection_height box_area = box[0]*box[1] centroid_area = centroid[0]*centroid[1] iou = intersection_area / (box_area + centroid_area - intersection_area) return 1 - iou def kmeans(boxes, k=9, dist_func=iou_distance): num_boxes = len(boxes) last_nearest = np.zeros((num_boxes,)) centroids = boxes[np.random.choice(num_boxes, k, replace=False)] while True: nearest_centroids_ids = [] for b in boxes: distances = [dist_func(b, c) for c in centroids] nearest_centroid_id = int(np.argmin(distances)) nearest_centroids_ids.append(nearest_centroid_id) if (last_nearest == nearest_centroids_ids).all(): break for idx in range(k): selected_boxes = [b for b, cid in zip(boxes, nearest_centroids_ids) if cid==idx] if not selected_boxes: continue new_cx = sum([b[0] for b in selected_boxes])/len(selected_boxes) new_cy = sum([b[1] for b in selected_boxes])/len(selected_boxes) centroids[idx] = [new_cx, new_cy] last_nearest = nearest_centroids_ids return centroids ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值