You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化公寓筛选条件判断逻辑?替代多层if-else方案咨询

更简洁的公寓筛选条件检查方案

绝对有更简洁的方式来处理这种多条件筛选!你遇到的多层嵌套if-else问题,核心是把条件判断扁平化,让每个筛选规则独立出来,最后用逻辑与(&&)组合所有需要满足的条件,完全不用嵌套。

核心思路:独立判断每个筛选条件

对于每个筛选条件,我们只需要判断两种情况:

  • 如果条件未定义(值为UNDEFINED_FILTER),则直接视为满足该条件;
  • 如果条件已定义,则检查公寓是否符合该条件。

把每个条件的判断结果存为布尔值,最后只要所有布尔值都为true,就打印该公寓信息。

代码示例(扁平化版本)

#define UNDEFINED_FILTER -1

// 遍历公寓链表
while (currentAprt != NULL) {
    // 逐个判断每个筛选条件,未定义则直接视为满足
    bool meetsMaxPrice = (maxPrice == UNDEFINED_FILTER) || (currentAprt->price < maxPrice);
    bool meetsMinRooms = (minimumNumOfRooms == UNDEFINED_FILTER) || (currentAprt->numOfRooms >= minimumNumOfRooms);
    bool meetsMaxRooms = (maximumNumOfRooms == UNDEFINED_FILTER) || (currentAprt->numOfRooms <= maximumNumOfRooms);
    // 如果需要添加日期筛选条件,同样按这个逻辑扩展:
    // bool meetsEvacDate = (evacDate == UNDEFINED_FILTER) || (/* 你的日期判断逻辑 */);

    // 所有条件都满足时打印公寓信息
    if (meetsMaxPrice && meetsMinRooms && meetsMaxRooms /* && meetsEvacDate */) {
        printf("Apartment code: %d\n", currentAprt->code);
        printf("Apartment address: %s\n", currentAprt->address);
        printf("Apartment price: %d\n", currentAprt->price);
        printf("Number of rooms: %d\n", currentAprt->numOfRooms);
        printf("Possible entry date: %s\n", currentAprt->enteryDate);
        printf("Adding date: %s\n\n", currentAprt->addingDate);
    }

    currentAprt = currentAprt->next;
}

进一步优化:封装筛选逻辑为函数

如果后续需要添加更多筛选条件,或者想让主逻辑更清晰,可以把筛选判断封装成独立函数,符合单一职责原则:

typedef struct Apartment {
    int code;
    char *address;
    int price;
    int numOfRooms;
    char *enteryDate;
    char *addingDate;
    struct Apartment *next;
} Apartment;

#define UNDEFINED_FILTER -1

// 封装筛选逻辑的函数
bool apartmentMeetsCriteria(Apartment *apt, int maxPrice, int minimumNumOfRooms, int maximumNumOfRooms) {
    if (!apt) return false; // 空指针直接返回不满足

    bool priceOk = (maxPrice == UNDEFINED_FILTER) || (apt->price < maxPrice);
    bool minRoomsOk = (minimumNumOfRooms == UNDEFINED_FILTER) || (apt->numOfRooms >= minimumNumOfRooms);
    bool maxRoomsOk = (maximumNumOfRooms == UNDEFINED_FILTER) || (apt->numOfRooms <= maximumNumOfRooms);

    return priceOk && minRoomsOk && maxRoomsOk;
}

// 主遍历逻辑
void printMatchingApartments(Apartment *head, int maxPrice, int minimumNumOfRooms, int maximumNumOfRooms) {
    Apartment *currentAprt = head;
    while (currentAprt != NULL) {
        if (apartmentMeetsCriteria(currentAprt, maxPrice, minimumNumOfRooms, maximumNumOfRooms)) {
            // 打印公寓信息
            printf("Apartment code: %d\n", currentAprt->code);
            printf("Apartment address: %s\n", currentAprt->address);
            printf("Apartment price: %d\n", currentAprt->price);
            printf("Number of rooms: %d\n", currentAprt->numOfRooms);
            printf("Possible entry date: %s\n", currentAprt->enteryDate);
            printf("Adding date: %s\n\n", currentAprt->addingDate);
        }
        currentAprt = currentAprt->next;
    }
}

这种方式的优势

  1. 可读性极强:每个筛选条件的逻辑一目了然,不用在嵌套里找对应分支;
  2. 扩展性好:新增筛选条件(比如面积、楼层)只需要在判断里加一行布尔值,然后在if里加一个&&即可;
  3. 易维护调试:可以单独测试每个条件的判断逻辑,定位问题更方便;
  4. 代码更简洁:完全消除了多层嵌套的“金字塔”结构。

内容的提问来源于stack exchange,提问作者Oran Sherf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:23:19